二进制位运算

2023-05-16

http://blog.csdn.net/gzu_imis/article/details/20078479

 

1.原码 反码 和 补码

二进制位元算包括按位与、按位或、按位异或、取反、左移以及右移这几种运算,运算都使用补码,结算的结果也是补码

如果其他进制,比如最常见的十进制要进行二进制位运算,那么先得把十进制数转成二进制数

在了解二进制位运算之前,就要先掌握进制转换,那么先来复习一下几个概念:原码、反码、补码

以下我们假设整数均用1个字节表示,1个字节即8个二进制位

1.1 原码

计算机对数字的二进制表示,原码使用最高位表示符号位:0表示正数,1表示负数,比如

0 0 0 0 1 0 1 1 =====》 表示正数 11

1 0 0 0 1 0 1 1 =====》 表示负数 -11

原码的缺点是:不能直接参与运算

比如上述 11 + (-11) 结果应该为 0 才对,但是如果我们把二进制直接相加(注意逢2进1)

1 0 0 1 0 1 1 0 =====》 表示负数 -22

很明显不对,所以为了表示正确的计算,又定义了反码和补码的,参与运算的都是补码

1.2 反码

把每个二进制位取反,即0变成1,1变成0,但是符号位保持不变

只不过:正数的反码和原码一样,没有任何变化,那么我们来看下 -11 的反码是怎么表示的

(1)先看 -11 的原码,得到 1 0 0 0 1 0 1 1 =====》 -11 的原码

(2)每个二进制位取反,符号位不变,得到 1 1 1 1 0 1 0 0 =====》 -11 的反码

1.3 补码

【反码 + 1】 就得到补码,不过正数的补码和原码也是一样的,没有任何变化,那么我们来看 -11 的补码是如何表示的

(1)-11 的反码已经计算出来 1 1 1 1 0 1 0 0 =====》 -11 的反码

(2)+1 的操作,注意逢二进一,得到结果是 1 1 1 1 0 1 0 1 =====》 -11 的补码

好了,我们再来看下 11 + (-11) 的操作,注意前面已经说过,都使用补码的计算

0 0 0 0 1 0 1 1 =====》 正数 11 的补码

1 1 1 1 0 1 0 1 =====》 负数 -11 的补码

===========================================

0 0 0 0 0 0 0 0 =====》根据逢二进一的相加操作,得到结果就是 0 ,这和我们预期结果相同

之前说过运算使用补码,并且计算结果也是用补码,那么拿到补码之后,怎么还原成十进制数呢?

对于正数而言,因为反码和补码都是相同的,所以一个补码,比如 0 0 0 0 0 0 1 1 ,很明显:十进制数就是 3

对于负数而言,【反码 + 1】 = 补码 所以推导出来 【反码】 = 【补码 - 1】,所以上述补码计算的反码结果为

1 1 1 1 1 1 0 0 ,那么得到反码了,原码就很简单了,直接取反即可,符号位还是保持不变,最终得到

1 0 0 0 0 0 1 1 , 这样我们很明显看出来,十进制数就是 -3

2.二进制位运算

已经了解原码、反码和补码的概念了,并且也了解二进制运算使用补码,结果也是补码

那来看一下二进制位运算的规律

2.1 按位与 &

1 & 1 结果等于1,其他结果为0,你可以把这个看做boolean类型的 && 运算,只有都为真,结果才为真

2.2 按位或 |

0 | 0 结果等于0,其他结果为1,你可以把这个看做boolean类型的 || 运算,只有都为假,结果才为假

2.3 按位异或 ^

0 ^ 0 结果等于0

1 ^ 1 结果等于0

0 ^ 1 结果等于1

1 ^ 0 结果等于1

因此,相同异或结果为0,相异异或结果为1,你可以把这个看做异性相吸吧。。。

2.4 按位取反

这个最简单,就是1变0,1变0

比如 7 的二进制表示是 0 0 0 0 0 1 1 1

那么 ~7 按位取反之后 1 1 1 1 1 0 0 0

再次提醒,二进制位运算的结果是补码,不要把上面计算结果搞成原码哦

所以,反码 = 补码 -1 ,得到 1 1 1 1 0 1 1 1 我想逢二进一你会计算,借位想减你应该会

所以原码就是反码取反呗, 1 0 0 0 1 0 0 0 这才对到 -7 取反的结果,就是 -8

没有错,为什么这么巧呢,7取反的结果就是 -8 ,其实 10 取反的结果就是 -11

那么负数呢,那就反过来,比如 -11 取反的结果就是 10

2.5 按位左移 <<

往左边移动几位,右边就补几个0,正因为是右边补0,而我们知道符号位在左边,所以右边如果有1移到符号为了,结果就产生负数了

比如 7 的二进制是 0 0 0 0 0 1 1 1

那么 7<<2 表示要左移两位 0 0 0 1 1 1 0 0 结果是 28

你发现 7 *4 = 28 了吧,因为左移几位,就是把【原来的数 * 2的位移次指数】

右比如在Java里面, Integer.MAX_VALUE << 1 就是拿最大正数在往左移,就发现结果为 -2 了

2.5 按位右移 >>

往右边移动几位,左边补符号位,即正数右移3位,那么左边补3个0,负数右移3位,则左边补3个1

2.6 不带符号右移 >>>

不带符号右移,就是左边全补0,不管是正数还是负数

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二进制位运算 的相关文章

  • 别再让C++头文件中出现“using namespace xxx;”

    在这里 xff0c 我毫不回避地说了这句话 xff1a 引用 我再也不想在任何头文件中看到 using namespace xxx 了 作为一个开发者 团队领导者 xff0c 我经常会去招聘新的项目成员 xff0c 有时候也帮助其他组的人来
  • Linux 查看监听端口的方法

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • 一口气说出 OAuth2.0 的四种授权方式

    上周我的自研开源项目开始破土动工了 xff0c 开源项目迈出第一步 xff0c 10 选 1 xff1f 页面模板成了第一个绊脚石 xff0c 密谋很久才付诸行动 xff0c 做这个的初衷就是不想让自己太安稳 xff0c 技术这条路不进步就
  • SVN MERGE 和冲突

    摘要 xff1a 最佳做法是避免冲突 冲突时 xff0c 不要把branch merge到trunk 先由最新版本的trunk得到branch 然后再修改文件 xff0c 直接merge过去就行 这样不会有冲突 先用svn merge dr
  • Linux命令之basename使用

    basename 命令 首先使用 help 参数查看一下 basename命令参数很少 xff0c 很容易掌握 basename help 用法示例 xff1a basename usr bin sort 输出 34 sort 34
  • 各种编码知识简介

    本文主要介绍我们在日常开发中接触到了latin1 xff0c GBK xff0c GB18030 xff0c UTF 8 编码几种 下面首先来看看这几种编码的的区别 latin1 1 先来看看latin1 参考百度百科 Latin1 是IS
  • Linux 技巧:让进程在后台可靠运行的几种方法

    我们经常会碰到这样的问题 xff0c 用 telnet ssh 登录了远程的 Linux 服务器 xff0c 运行了一些耗时较长的任务 xff0c 结果却由于网络的不稳定导致任务中途失败 如何让命令提交后不受本地关闭终端窗口 网络断开连接的
  • nohup命令浅析

    要将一个命令放到后台执行 xff0c 我们一般使用nohup sh command amp amp 都知道是放到后台执行这个命令 xff0c 那么nohup是做什么的 xff1f 这就要从unix的信号说起 xff0c unix的信号机制可
  • 《曾国藩家书大全集》读书笔记——励志篇

    曾国藩将立志作为人生第一要义 xff0c 只要能立志 xff0c 便人人都可以做圣贤豪杰 人生不但要立志 xff0c 还要持之以恒 xff0c 持之以恒是人生第一美德 xff0c 人而无恒 xff0c 将一事无成 曾国藩很重视逆境对人心志的
  • 常见通信协议整理归纳

    一 串行通信与并行通信 1 串行通信 简称串口 串行接口 xff0c 指数据一位一位地顺序传送 xff0c 比如 UART RS232 RS485等 xff0c 串行通信根据发送时源和接收时源是否保持一致 xff0c 又分为同步通信和异步通
  • 书,永远的朋友

    我自己认为我是一个不大喜欢看书的人 xff0c 相对于书 xff0c 我可能跟喜欢看视频和同高手一起讨论交流 但是 xff0c 真正静下心来 xff0c 想着这么多年来 xff0c 对我影响很大的一些书 xff0c 也能想到一些 索性 xf
  • docker镜像搜索网站

    docker https hub docker com search type 61 image
  • Qt 官方示例 | 了解文件读写,看这个例子就够了

    大家好 xff0c 我是老吴 xff0c 一枚勤劳的嵌入式底层劳动人民 我又双叒叕来分享 Qt 的学习心得了 学习 Qt 的最佳途径是阅读官方的手册和示例 xff0c 今天要分享的是 Qt 官方提供的示例 xff1a notepad not
  • 【鸿蒙Harmony OS】Hi3861 开发板简介

    Hi3861开发板介绍 本文档介绍Hi3861 WLAN模组的开发环境搭建 版本编译构建 烧录 源码修改 调试验证等方法 通过学习 xff0c 开发者会对Hi3861 WLAN模组开发流程有初步认识 xff0c 并可上手业务开发 开发板简介
  • VMware 错误:“驱动器未就绪

    用VMware安装系统 xff0c 每次启动都要提示错误 xff1a 驱动器未就绪 xff0c 点取消才能进入 是挺烦的 这是软驱的事 解决办法 xff1a 如图 xff0c 双击 39 Device 39 选项卡中的 39 Floppy
  • STM32H743 UART接收中断设置与原理剖析(HAL库结合FreeRTOS操作系统)

    硬件平台 xff1a STM32H743 软件平台 xff1a Keil 5 采用HAL库 43 FreeRTOS系统 初始化UART配置 void DEBUG USART Config void GPIO InitTypeDef GPIO
  • STM32+HAL+FreeRTOS串口接收一批数据后随机卡死bug的解决办法与详细探索思路(发送函数和接收函数不能同时使用)

    项目背景 keil5 43 HAL库 43 FreeRTOS系统 43 STM32H743 xff0c 存在两个同等优先级的任务 xff0c 一个任务通过串口读取数据 xff0c 一个任务通过串口发送数据 xff0c 从而与其他设备进行信息
  • C中哪些方式定义的字符串,其末尾会自动添加‘\0’

    一 0 的本质 xff1a 39 0 39 就是8位的00000000 xff0c 因为字符类型中并没有对应的这个字符 xff0c 所以这么写 39 0 39 就是 字符串结束标志 39 0 39 是转译字符 xff0c 意思是告诉编译器
  • IMU/GNSS组合导航经典论文&论文合集&IMU校准&ahrs滤波算法

    1 ALLAN方差分析 xff1a 硕士论文 xff1a Modeling Inertial sensors errors using allan variance 文章 xff1a 2 校准算法 xff1a A New Calibrati

随机推荐