两种常见的与「二进制表示中最低位」相关的位运算技巧

138 阅读1分钟

第一个技巧

n & (n - 1)

其中 & 表示按位与运算。

该位运算技巧可以直接将 n 二进制表示的最低位 1 移除,它的原理如下:

假设 n 的二进制表示为 (a10⋯0) 2,其中 a 表示若干个高位,1 表示最低位的那个 1,0⋯0 表示后面的若干个 0,那么 n−1 的二进制表示为:(a01⋯1)2

我们将 (a10⋯0)2 与 (a01⋯1)2进行按位与运算,高位 a 不变,在这之后的所有位都会变为 0,这样我们就将最低位的那个 1 移除了。

第二个技巧是

n & (-n)

其中 −n 是 n 的相反数,是一个负数。该位运算技巧可以直接获取 n 二进制表示的最低位的 1

由于负数是按照补码规则在计算机中存储的,−n 的二进制表示为 n 的二进制表示的每一位取反再加上 1,因此它的原理如下:

假设 n 的二进制表示为 (a10⋯0)2,其中 a 表示若干个高位,1 表示最低位的那个 1,0⋯0 表示后面的若干个 0,那么 −n 的二进制表示为:

(aˉ01⋯1)2+(1)2 =(aˉ10⋯0)2 其中 aˉ表示将 a 每一位取反。我们将 (a10⋯0)2与 (aˉ10⋯0)2进行按位与运算,高位全部变为 0,最低位的 1 以及之后的所有 0 不变,这样我们就获取了 n 二进制表示的最低位的 1。