代码已经在 GITHUB 开源,👉点击直达👈。

一、如何判断二进制数的第 k 位值?

对于该问题,方法非常的简单,计算方法如下:

1
(x >> k) & 1

举个例子:判断 18 的二进制形式的第 3 位的值。

首先,18 的二进制形式为:

1
0000 ... 0001 0010

将其右移 3 位后得到:

1
0000 ... 0000 0010

接着和 1 做“与”运算,得到:

1
2
3
4
  0000 ... 0000 0010 // 18 右移 3 位
& 0000 ... 0000 0001 // 数字 1
----------------------
0000 ... 0000 0000 // (18 >> 3) & 1 = 0

可以看到运算结果为 0,也就是 18 的二进制形式的第 3 位是 0。

二、计算二进制数最后一个 1 及后续位的 0 所表示的数值

标题可能描述的还不够清楚,举个例子:如果一个二进制数为:

1
0000 ... 0000 1110

那么,题目的意思就是求:

1
____ ... ____ __10

所代表示的数值。


根据计算机负数表示的特点,如一个数字原码是 10001000,他的负数表示形势是补码,就是反码 +1,反码是 01110111,加一则是 01111000,二者按位与得到了 1000,就是我们想要的 lowbit 操作。所以,我们可以封装出以下函数:

1
2
3
int lowbit(int x) {
return x & -x;
}