[AcWing]位运算(二进制的最后一个 1)
代码已经在 GITHUB 开源,👉点击直达👈。
一、如何判断二进制数的第 k 位值?
对于该问题,方法非常的简单,计算方法如下:
1 | (x >> k) & 1 |
举个例子:判断 18 的二进制形式的第 3 位的值。
首先,18 的二进制形式为:
1 | 0000 ... 0001 0010 |
将其右移 3 位后得到:
1 | 0000 ... 0000 0010 |
接着和 1 做“与”运算,得到:
1 | 0000 ... 0000 0010 // 18 右移 3 位 |
可以看到运算结果为 0,也就是 18 的二进制形式的第 3 位是 0。
二、计算二进制数最后一个 1 及后续位的 0 所表示的数值
标题可能描述的还不够清楚,举个例子:如果一个二进制数为:
1 | 0000 ... 0000 1110 |
那么,题目的意思就是求:
1 | ____ ... ____ __10 |
所代表示的数值。
根据计算机负数表示的特点,如一个数字原码是 10001000,他的负数表示形势是补码,就是反码 +1,反码是 01110111,加一则是 01111000,二者按位与得到了 1000,就是我们想要的 lowbit 操作。所以,我们可以封装出以下函数:
1 | int lowbit(int x) { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 SeaEpoch!
评论