这段Java位运算代码的执行原理是什么?请解析a & -a部分
代码执行逻辑详解
先回顾已知步骤:
- s=4(二进制
0100),k=3(二进制0011),异或运算s^k得到0111(十进制7),所以变量a=7。
接下来重点解释b = a & -a的运算过程:
1. Java中整数的存储规则
Java里所有整数都是以补码形式存储的,负数的补码计算规则是:
- 先取该正数的二进制原码
- 对原码按位取反(得到反码)
- 最后加1,得到负数的补码
2. 计算-a的补码(a=7)
- 7的32位二进制原码:
00000000 00000000 00000000 00000111 - 按位取反得到反码:
11111111 11111111 11111111 11111000 - 反码加1得到-7的补码:
11111111 11111111 11111111 11111001
3. 执行按位与运算a & -a
把a(7)和-a(-7)的二进制对齐做按位与(只有对应位都为1时结果才是1,否则为0):
00000000 00000000 00000000 00000111 & 11111111 11111111 11111111 11111001 --------------------------------------- 00000000 00000000 00000000 00000001
结果就是二进制000...0001,对应十进制1,这就是程序输出1的原因。
这个运算的通用作用
a & -a是一个常用的位运算技巧,它的作用是提取整数a的二进制表示中最右边的1对应的数值。比如:
- 若a=6(二进制
110),a&-a结果是2(二进制10) - 若a=8(二进制
1000),a&-a结果是8(二进制1000)
内容的提问来源于stack exchange,提问作者Sharath Cherry
相关产品推荐
相关产品推荐

