x = x & (x - 1)的意义:
我们知道 & 为 按位与 运算符,有如下性质:
1 & 1 == 1
1 & 0 == 0
0 & 1 == 0
0 & 0 == 0
x & (x - 1)就是将二进制x的最后一个1置为0,如2015的二进制为11111011111,则进行一次 x & (x - 1) 运算后x的值变为11111011110,可以手动模拟一下,很简单,所以配合这个我们在设置一个计数器count,初始为0,外面套一个while循环,循环条件为x不为0,就可以计算x的二进制中1的个数,程序如下:
#include "stdafx.h"
#include<iostream>
using namespace std;
int func(int x)
{
int count = 0;
while (x)
{
count++;
x = x&(x - 1);
}
return count;
}
int main()
{
cout << func(2015) << endl;
return 0;
}
这是京东的一道笔试题。
Q: 把一个int型的数的二进制的最右边那个1找出来(小技巧)
public static int findRightOne(int N){
return N & (~N + 1);
}