表达式:(n&(n-1))==0——n是否是一个2幂次方的数

一、分析一下

(n&(n-1))==0——n是否是一个2幂次方的数?

1、找规律

0:0000

1:0001

2:0010

3:0011

4:0100

5:0101

6:0110

7:0111

8:1000

......

我可以发现1&0等于0;2&1等于0;4&3等于0;8&7等于0。

1、2、4、8都是2幂次方的数。


二、实战场景

1、判断当前编译环境指针的大小是否正确。

我们知道指针的大小肯定为一个2幂次方的数。


const int align = (sizeof(void*) > 8) ? sizeof(void*) : 8;
assert((align & (align-1)) == 0); 


2、求一个数的二进制表示中1的个数


while (n >0 )
 {
      count ++;
      n &= (n-1);
}



上一篇:基础:内核态和用户态的区别


下一篇:HealthKit之实战写入和删除