分析
只考虑x>=0的情况
x&(x-1)
x-1在二进制中实际上是把从右往左数的第一个1变成0,右边所有的0变成1,左边的部分不变化
//例如
11001000 十进制200
11000111 十进制199
两个数字按位与之后可以把右边的部分全部置0
PS:同理,按位异或可以把左边的部分全部置0。
应用
利用这个性质,有几个比较常见的用法
统计二进制位中1的个数
while(x!=0)
{
countx++;
x = x&(x-1);
}
没一次循环消除最右边的一个1,循环n次就变成了0.
判断是否为2的n次方
return x&(x-1) == 0? true : false;
2的n次方特点是最高位为1,其余位均为0,执行一次该运算就变成了0.
或者可以理解为仅有一位1,按照上一例的思路同样可以判断。