二进制操作最右侧位
1 将最右侧的1变成0(可利用判断是不是2的幂)
下面这个公式可以将一个数x的最右侧1变成0,如果没有1,则生成的所有位都是0。
x &(x-1)
例如:0101 1000 B -----> 0101 0000 B
这个公式还可以用来检测该数是不是2的幂,如果一个数是2的幂,那么必然满足:
x &(x-1) = 0
比较常见的应用就是:判断是否只有有个按键按下。
同样的道理,也可以用类似的办法来判断一个数是不是2n-1:
x&(x+1) = 0
2 传播最右侧位
利用以下公式可以传播最右侧的1,如果为 0,则生成的是1。
x | (x-1)
例如:0101 1000 B -----> 0101 1111 B
3 将最右侧0变成1
利用以下公式可以将最右侧0变成1,如果没有0,则生成的所有位都是1。
x | (x+1)
例如:1010 0111 B -----> 1010 1111 B