当前位置: 首页 > news >正文

算法通关村第11关【青铜】| 位运算基础

1.数字在计算机中的表示

原码、反码和补码都是计算机中用于表示有符号整数的方式。它们的使用旨在解决计算机硬件中的溢出和算术运算问题。

  1. 原码(Sign-Magnitude): 原码最简单,它的表示方式是用最高位表示符号位,0表示正数,1表示负数,其余位表示数值的绝对值。例如,+5 的原码是 00000101,-5 的原码是 10000101。

  2. 反码(One's Complement): 反码表示方式在原码的基础上,负数的表示方式稍作修改。对于正数,反码与原码相同。对于负数,反码是将原码中的1变成0,0变成1。例如,+5 的反码仍然是 00000101,-5 的反码是 11111010。

  3. 补码(Two's Complement): 补码是计算机中最常用的表示方式。它也在原码的基础上稍作修改。对于正数,补码与原码相同。对于负数,补码是将原码中的1变成0,然后在最低位加1。例如,+5 的补码仍然是 00000101,-5 的补码是 11111011。

为什么需要反码和补码以及它们的优点

  • 解决0的表示问题: 在原码中,+0 和 -0 有不同的表示,这可能引起混淆。而在反码和补码中,+0 和 -0 都有相同的表示。

  • 简化加法运算: 使用补码可以简化加法运算,因为负数的补码加法可以与正数的加法一样进行,而不需要额外的规则。

  • 解决溢出问题: 补码在进行加法和减法时,能够自然地处理溢出。当结果超出表示范围时,溢出的位会被丢弃,而不会引发错误。

计算机是如何进行加减运算的

  • 加法运算: 在计算机中,加法运算通常使用补码来执行。两个数相加,首先将它们的补码相加,然后检查是否有溢出。如果有溢出,溢出的位将被丢弃。补码的加法可以简化为模运算,其中模是2的n次方,n 是数据类型的位数。结果可能会包含一个溢出标志位,用于指示运算是否溢出。

  • 减法运算: 减法运算也使用补码来执行。将被减数的补码与减数的补码相加,然后检查是否有溢出。同样,结果可能会包含一个溢出标志位。这种方式使加法和减法可以使用相同的硬件电路来执行,从而简化了计算机的设计。

原码、反码和补码是计算机中表示有符号整数的方式,它们在解决符号、0表示和溢出问题方面各具优势。补码通常是最常用的表示方式,因为它能够自然地处理加法和减法,并且不需要特殊的规则。

2.位运算规则

位运算是计算机中用于操作二进制位的一组操作符。这些操作符允许您直接操纵数字的二进制表示,通常用于执行一些特定的位级操作。以下是常见的位运算操作和规则:

(1)与、或、异或、取反

  1. 按位与(AND): 使用 & 操作符执行按位与操作。将两个数字的每个位都与对应位置的位进行比较,如果都为1,则结果位为1,否则为0。

    5 & 3 = 1
    // 5 的二进制表示:101
    // 3 的二进制表示:011
    // 按位与的结果:001
    
  2. 按位或(OR): 使用 | 操作符执行按位或操作。将两个数字的每个位都与对应位置的位进行比较,如果至少有一个为1,则结果位为1,否则为0。

    5 | 3 = 7
    // 5 的二进制表示:101
    // 3 的二进制表示:011
    // 按位或的结果:111
    
  3. 按位异或(XOR): 使用 ^ 操作符执行按位异或操作。将两个数字的每个位都与对应位置的位进行比较,如果两个位不同,则结果位为1,否则为0。

    5 ^ 3 = 6
    // 5 的二进制表示:101
    // 3 的二进制表示:011
    // 按位异或的结果:110
    
  4. 按位取反(NOT): 使用 ~ 操作符执行按位取反操作。将数字的每个位都翻转,0 变为1,1 变为0。

    ~5 = -6  // 注意:取反后可能是负数
    // 5 的二进制表示:101
    // 按位取反的结果:-110
    
  5. 左移(<<)和右移(>>): 使用 << 操作符执行左移操作,将数字的二进制表示向左移动指定的位数,右侧用0填充。使用 >> 操作符执行右移操作,将数字的二进制表示向右移动指定的位数,左侧用符号位(对于有符号数)或0填充。

    5 << 2 = 20
    // 5 的二进制表示:00000101
    // 左移2位的结果:00010100-5 >> 1 = -3
    // -5 的二进制表示:11111011
    // 右移1位的结果:11111101
    

(2)算术移位和逻辑移位

算术移位是一种将数字的二进制位向左或向右移动的操作,但与逻辑移位不同,它在向右移动时保留了符号位。对于正数,算术右移将在左侧填充0,而对于负数,算术右移将在左侧填充1,以保持负数的符号。

  • 算术右移:右侧填充0或1,取决于数字的符号。
  • 算术左移:左侧填充0。

例子:

正数 5 的二进制表示: 0000 0101

正数 5 的算术右移 1 位: 0000 0010(保留符号位0,右侧填充0)

负数 -5 的二进制表示: 1111 1011

负数 -5 的算术右移 1 位: 1111 1101(保留符号位1,右侧填充1)

逻辑移位(Logical Shift)

逻辑移位是一种将数字的二进制位向左或向右移动的操作,不考虑符号位。逻辑移位在向右或向左移动时都填充0。

  • 逻辑右移:右侧填充0。
  • 逻辑左移:左侧填充0。

例子:

正数 5 的二进制表示: 0000 0101

正数 5 的逻辑右移 1 位: 0000 0010

负数 -5 的二进制表示: 1111 1011

负数 -5 的逻辑右移 1 位: 0111 1101

总结:

  • 算术移位保留符号位并根据符号位进行填充,因此用于数学运算,如除法和乘法。
  • 逻辑移位不考虑符号位,始终填充0,通常用于位级操作和数据处理。

(3)位运算常用技巧

  1. 获取特定位的值:

    num = 42   # 二进制:101010
    bit_2 = (num >> 2) & 1  # 获取第2位的值
    print(bit_2)  # 输出 1
    
    获取第n位的值:使用右移和按位与操作 ((num >> n) & 1)。这将把第n位的值提取出来(0或1)。
  2. 设置特定位的值:

    设置第n位为1:使用按位或操作 num |= (1 << n)
  3. 清零特定位:

    清零第n位:使用按位与和取反操作 num &= ~(1 << n)
  4. 更新特定位的值:

    更新第n位的值为1或0:首先清零第n位,然后使用按位或操作设置新值。

这些技巧可以用于对二进制数据进行高效的位级操作,例如对寄存器或标志位进行处理,或者用于位图操作等。在实际编程中,它们通常用于优化性能、节省内存或执行特定的位级任务。

相关文章:

算法通关村第11关【青铜】| 位运算基础

1.数字在计算机中的表示 原码、反码和补码都是计算机中用于表示有符号整数的方式。它们的使用旨在解决计算机硬件中的溢出和算术运算问题。 原码&#xff08;Sign-Magnitude&#xff09;&#xff1a; 原码最简单&#xff0c;它的表示方式是用最高位表示符号位&#xff0c;0表示…...

无涯教程-Android - RadioGroup函数

RadioGroup类用于单选按钮集。 如果我们选中属于某个单选按钮组的一个单选按钮,它将自动取消选中同一组中以前选中的任何单选按钮。 RadioGroup属性 以下是与RadioGroup控制相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以在运行时更改这些属性的相关…...

降噪音频转录 Krisp: v1.40.7 Crack

主打人工智能降噪服务的初创公司「Krisp」近期宣布推出音频转录功能&#xff0c;能对电话和视频会议进行实时设备转录。该软件还整合的ChatGPT&#xff0c;以便快速总结内容&#xff0c;开放测试版于今天上线。 随着线上会议越来越频繁&#xff0c;会议转录已成为团队工作的重…...

基于React实现:弹窗组件与Promise的有机结合

背景 弹窗在现代应用中是最为常见的一种展示信息的形式&#xff0c;二次确认弹窗是其中最为经典的一种。当我们在React&#xff0c;Vue这种数据驱动视图的前端框架中渲染弹窗基本是固定的使用形式。 使用方式&#xff1a;创建新的弹窗组件&#xff0c;在需要弹窗的地方引用并…...

docker使用(一)生成,启动,更新(容器暂停,删除,再生成)

docker使用&#xff08;一&#xff09; 编写一个 Dockerfile构建镜像构建失败构建成功 运行镜像运行成功 修改代码后再次构建请不要直接进行构建&#xff0c;要将原有的旧容器删除或暂停停止成功删除成功再次构建且构建成功&#xff01; 要创建一个镜像&#xff0c;你可以按照以…...

用Qt自制一个小闹钟

小闹钟 功能 当按下启动按钮时&#xff0c;停止按钮可用&#xff0c;启动按钮不可用&#xff0c;闹钟无法设置&#xff0c;无法输入自定义内容 当按下停止按钮时&#xff0c;暂停播报&#xff0c;启动按钮可用&#xff0c;闹钟可以设置&#xff0c;可以输入自定义内容 .pro文…...

Vue2.0/Vue3.0使用xlsx+xlsx-style实现导出Excel文件

一、依赖导入 1、Vue2 Webpack构建的 npm i xlsx npm i xlsx-style npm i file-saver同时修改以下&#xff1a; 解决 Can’t resolve ‘./cptable’ in ‘…’ 的问题&#xff0c;在 vue.config.js 文件中加入该配置 module.exports {externals: {./cptable: var cptable}…...

【Kafka系列】(一)Kafka入门

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 Kafka是什么&#xff1f; 一句话概括&#xff1a;「Apache Kafka 是一款开源的消息引擎系统」 什么是消息引擎系统&#…...

外包干了2个月,技术退步明显了...

先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年8月份&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

python实现语音识别

1. 首先安装依赖库 pip install playsound # 该库用于播放音频文件 pip install speech_recognition # 该库用于语音识别 pip install PocketSphinx # 语音识别模块中只有sphinx支持离线的&#xff0c;使用该模块需单独安装 pip install pyttsx3 # 该库用于将文本转换为语音播…...

java八股文面试[多线程]——线程的状态

5种状态一般是针对传统的线程状态来说&#xff08;操作系统层面&#xff09; 6种状态&#xff1a;Java中给线程准备的 NEW&#xff1a;Thread对象被创建出来了&#xff0c;但是还没有执行start方法。 RUNNABLE&#xff1a;Thread对象调用了start方法&#xff0c;就为RUNNABLE状…...

Go学习[合集]

文章目录 Go学习-Day1Go学习-Day2标识符变量基础语法字符串类型类型转换string和其他基本类型转换其他类型转stringstring转其他类型 指针类型运算符标准IO分支语句 Go学习-Day3循环语句函数声明init函数匿名函数闭包defer Go学习-Day4函数值传递&#xff0c;引用传递常用的函数…...

代码随想录算法训练营第42天 | ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

文章目录 前言一、01背包问题&#xff0c;你该了解这些&#xff01;二、01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组三、416. 分割等和子集总结 前言 01背包 一、01背包问题&#xff0c;你该了解这些&#xff01; 确定dp数组以及下标的含义 对于背包问题&#x…...

解决DNS服务器未响应错误的方法

​当你将设备连接到家庭网络或具有互联网接入功能的Wi-Fi热点时,由于各种原因,互联网连接可能无法正常工作。本文中的说明适用于Windows 10、Windows 8和Windows 7。 无法连接到DNS服务器的原因 故障的一类与域名系统有关,域名系统是世界各地互联网提供商使用的分布式名称…...

SpringBoot的HandlerInterceptor拦截器使用方法

一、创建拦截器 通过实现HandlerInterceptor接口创建自己要使用的拦截器 import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.…...

java 常用 jar 包

1 Lombok 是一个 java 类库&#xff0c;它利用注解方式自动生成 java bean 中 getter、setter、equals 等方法&#xff0c;还能自动生成 logger、toString、hashCode、builder 等 日志相关变量、Object 类方法或设计模式相关的方法&#xff0c;能够让你的 代码更简洁&#xff0…...

C#面试十问

1&#xff1a;C#中变量类型分为哪两种&#xff1f;它们的区别是什么&#xff1f;2&#xff1a;Class和Struct的区别&#xff1f;3&#xff1a;C#中类的修饰符和类成员的修饰符有哪些&#xff1f;4&#xff1a;面向对象的三个特征&#xff08;特点&#xff09;是什么&#xff1f…...

Day 41 动态规划part03 : 343. 整数拆分 96.不同的二叉搜索树

96. 不同的二叉搜索树 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1…...

四轴飞行器的电池研究(MatlabSimulink仿真)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

准备HarmonyOS开发环境

引言 在开始 HarmonyOS 开发之前&#xff0c;需要准备好开发环境。本章将详细指导你如何安装 HarmonyOS SDK、配置开发环境、创建 HarmonyOS 项目。 目录 安装 HarmonyOS SDK 配置开发环境 创建 HarmonyOS 项目 总结 1. 安装 HarmonyOS SDK HarmonyOS SDK 是开发 Harmo…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...