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

【编程小记】位运算 x -x 表示含义

位运算 x & -x 表示含义

  • 一、原码反码补码
  • 二、位运算 x & -x 表示含义
  • 三、最终结论

一、原码反码补码

在计算机中,整数的数据的存储是按照补码的方式进行存储的

按照数据与0的大小,数据又被分为正数与负数

  • 正数的原码反码补码相同。
  • 负数的原码,反码,补码并不相同。它们之间的转换关系如下:
    • 负数的反码:该负数的原码除符号位外各位取反。
    • 负数的补码:负数的反码 + 1

我们来看下面的一个例子理解原码反码补码的求解:

[+1] = [00000001]= [00000001]= [00000001][-1] = [10000001]= [11111110]= [11111111]

通过上面的例子我们可以知道:
在计算机中取一个数 x(可正可负)的相反数,其实也就等价于:这个数的补码的基础上进行按位取反(包括符号位)之后在增加1

即:-x = (~x) +1

二、位运算 x & -x 表示含义

下面我们来讨论: 位运算 x & -x 表示含义

x为奇数时

例如: x = 3

x = 3
// 00000000  00000000  00000000  00000011   补码
-x
// 11111111  11111111  11111111  11111101   补码
ret = x & -x
//00000000  00000000  00000000  00000011   补码
//11111111  11111111  11111111  11111101   补码
ret
//00000000  00000000  00000000  00000001   补码

可以看到对于一个奇数如果执行表达式ret = x & -x 那么得到的结果是1,如果你不相信,你还可以试一试其他奇数。

原理分析

对于一个奇数 x,其比特位最后一位(最右边的那一位)一定是1 ,对这个奇数x取相反数也就相当于按位取反然后加一,奇数按位取反以后最后一位一定是0,然后+1后最后一位一定是1,但是 -x 除了最后一位与 x 相同,其余均不同,于是x & -x的结果一定是 1。

举例:

[+1]//   00000001  奇数的最后一位一定是1[-1]//   11111111  相反数是 按位取反 然后 +1, 导致最后一位与原数相等

x为偶数时

例如 x = 4

x = 6
// 00000000  00000000  00000000  00000110   补码
-x
// 11111111  11111111  11111111  11111001   反码
// 11111111  11111111  11111111  11111010   补码
ret = x & -x
// 00000000  00000000  00000000  00000110   补码
// 11111111  11111111  11111111  11111010   补码
ret
// 00000000  00000000  00000000  00000010   补码

观察结果ret我们会发现:

  1. 这个结果只有一位值是1, 其他位均是0 ,而且这个值为 1 的位置是与原数 x 从右向左第一个比特位为 1 的位置相同
  2. 这个值的末位0的个数与原值 x 保持一致

原理分析

  1. 原数 x 最低非0位右边所有的0,经由取反后全部变为1,反码+1会导致这些1逐位发生进位并变为0,最终进位记到最低非0位。
  2. 原最低非0位是1,取反后是0,进位到这一位0变成1,不再向左进位
  3. 原最低非0位左边的每一位经由取反后 和 原码 进行与运算必为0

三、最终结论

当一个数与其相反数相与(&):

如果这个数是奇数, 则结果必为1(这个1的位置与原数的最低非零位位置相同)。

如果这个数是偶数, 则结果是一个特殊的数据,与原数据的最低非零位相同位置为1,其他位置全为0

用途: 一般可以用来获取某个二进制数的最低非零位

http://www.lryc.cn/news/58015.html

相关文章:

  • 信创PC利旧管理新模式,麒麟信安助力国家某部委实现高效云办公
  • 【玩转RT-Thread】RT-Thread内核宏定义详解(rtdef.h)
  • PDF转化器免费版有哪些?这几款办公达人们都在用
  • 2022MathorCup赛题B
  • 适合销售使用的CRM系统特点
  • 项目中获取resource下文件路径的方法
  • Air32F103CBT6|CCT6|KEIL-uVsion5|本地编译|STClink|(6)、Air32F103编译下载
  • 结构(c的数据类型)
  • 前端常用的开工具库
  • 爬虫之数据库存储
  • 面试官:你可以用 for of 遍历 Object 吗?
  • 蓝桥杯基础12:BASIC-3试题 字母图形
  • 基于PaddleOCR开发懒人精灵文字识别插件
  • PyTorch 深度学习实战 | DIEN 模拟兴趣演化的序列网络
  • pyspark null类型 在 json.dumps(null) 之后,会变为字符串‘null‘
  • LeetCode - 两数相加
  • Office 2021专业版安装包及激活教程
  • git版本规范-前端
  • UEFI Device Path (1): 重新认识Device Path
  • 合成孔径成像的应用及发展
  • MyBatis-Plus的基本操作
  • HTTPAPI使用
  • Windos下设置java项目开机自启动
  • (链表)移除链表元素(双指针法)
  • Raft协议
  • 动态规划概述
  • CPU缓存架构+Disruptor内存队列
  • Spark SQL join操作详解
  • 设计模式-day04
  • 线段树的学习(2023.4.5)