取最靠右的1
1. 移位遍历
1 << i 在这里充当了一个指针。
int right_most_setbit(int num) {
for (int i = 0; i < 32; i++) {
if (!(num & (1 << i)))
return 1 << i;
}
return 0;
}
2. 利用特性
int right_most_setbit(int x){
return x - (x&x-1);
}
取最高位的1
利用负数的bit表示是其绝对值各位上取反后+1的特性,可以快速得到最左边的1.
int right_most_setbit(int x){
return x & -x;
}
统计所有1
int count_all_set_bit(int num){
int r = 0;
while(num){
++r;
num &= num-1; // x&=x-1 消除一个最右边的1
}
return r;
}