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

【C/C++】x -x 的含义

1、含义

-x 的值,其实就是在x的值的基础上进行按位取反(~x)之后在增加1所得(C语言中,-x实现是用取反+1实现)也就是说:x & -x == x & (~x + 1)

2、x 为偶数

当一个奇数 + 1时,表示的二进制数则会发生进位,这样的话,会产生一个连锁反应,也就是最低位的那些连续的1都会被清0,如:0000 0000 0111 1111 + 1 = 0000 0000 1000 0000

如果一个偶数,如 0000 0000 0100 1110,取反后的结果就变成了 1111 1111 1011 0001,而当这个值 + 1之后由于发生了进位,即:1111 1111 1011 0001 + 1 = 1111 1111 1011 0010

初始值 和 取反+1后的值 相 & 后,只会有一位保留为1

0000 0000 0100 1110 & 1111 1111 1011 0010 = 0000 0000 0000 0010 

这个结果与最初的值又有什么关系呢?
🤔显然, 这个值的与原值的末位0的个数是一致的,也就是说,如果一个偶数,在执行 x & -x 的操作时,最后结果肯定有如下两个特征:

① 这个结果只有一位值是1, 其他位均是0 
② 这个值的末位0的个数与原值保持一致

那这是个什么数呢?
🤔这个原值肯定是能被结果值整除的, 而这个结果值又是2^ k,那我们就可以描述成:当一个偶数与它的负值相 & 时,结果是能整除这个偶数的最大的2的幂。【即: m = n & -n ,则 n % m = 0 ,且 m = 2 ^ k】

3、x 为奇数

因为奇数取反后的值一定是偶数, 而偶数的值 + 1之后,并不会影响进位,而 x与其取反的数相 & 结果肯定是0 ,但是由于相 & 的数是取反后再+ 1的值(肯定是个奇数),也就是说,只有最后一位有翻转,所以只有最后一位都是1,相 & 结果仍旧是1,而其他位所有的都是相反值, 相 & 必为0。结论:如果 x 是奇数, 那 x & -x 的结果一定是1

4、❗结论

当一个数与其取负后的值相与(x & -x),如果这个数是偶数,则结果是能整除这个偶数的最大的2的幂(即: m = n & -n , 则 n % m = 0, 且 m = 2 ^ k);如果这个数是奇数,则结果必为1

5、❗用途

一般可以用来获取某个二进制数的 LowBit

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

相关文章:

  • [ZenTao]源码阅读:加载自定义任务类型
  • hive分区表 静态分区和动态分区
  • java八股文面试[多线程]——ThreadLocal底层原理和使用场景
  • Android hid发送apdu格式数据
  • Unity碰撞检测(3D和2D)
  • android:控件TextView
  • 3D风速仪 Gill Instruments Limited_R3-50 R3-100 and R3A -100 Manual
  • 深度学习怎么学?
  • WPF 数据验证
  • IDEA的maven想显示层级关系,而非平级
  • (八)k8s实战-身份认证与权限
  • 数学建模:TOPSIS分析
  • 【Qt学习】10 利用QSharedMemory实现单例运行
  • FPGA应用于图像处理
  • vscode python 无法引入上层目录解决
  • [开发|java] java list 取某个属性最大的项
  • 关闭浏览器的跨域校验
  • USRP 简介,对于NI软件无线电你所需要了解的一切
  • RTE_Driver驱动框架和Keil下开发需要支持的xxx_DFP软件包分析
  • ImportError: Cannot load dynamic library. Did you compile LSD?
  • 音频应用编程
  • 软件测试/测试开发丨Python 学习笔记 之 链表
  • Matlab 使用经验分享(常用函数介绍;矩阵常见计算)
  • 软件工程(十七) 行为型设计模式(三)
  • 在抖音中使用语聚AI,实现自动回复用户视频评论、私信问答
  • pyqt5-快捷键QShortcut
  • 匿名函数( lambda 表达式)
  • 基于SSM的汽车维修管理系统——LW模板
  • Ceph的纠删码特性 EC(Erasure Code)代码流程
  • 盘点那些国际知名黑客(上篇)