判断一个数是否是2的幂

最近在看《技术之瞳》,编程语言部分有一个笔试题目

Q:请填写一个表达式,用于判断一个数是否是2的幂?

A:首先要考虑数的正负,其次判断是否为2的幂,最好的办法是利用位运算技巧。

n>0? (n&(n-1))==0:false

Key

将2的幂次方写成二进制形式后,很容易就会发现有一个特点:

二进制中只有一个1,并且1后面跟了n个0。如果将这个数减去1后会发现,那个1会变为0,而原来的n个0会变为1。

举栗子说明

十进制   二进制
 2        10
 4        100
 8        1000
 16       10000
 ...       ...
 2-1      01
 4-1      011
 8-1      0111
 16-1     01111

因此将原来的数与其减去1后的数字进行&运算,为零,则原来的数是2的幂。

Note

  • & 按位与运算符:两位同时为1,结果才为1,否则为0。

作用:

1 . 清零;想让某个数清零,则另找一个数(原数为1的位置,新数为0),两个数作与运算。
2 . 取一个数中的某些位;若想取低字节位,则可和8个1作与运算。
3 . 保留指定位;若23,即10111,想保留左起的2,3,5位,则可和01101(13)作与运算。

  • | 按位或运算符:两位中有一个为1,结果就为1。

作用:

1 . 按位或运算常用来对一个数据的某些位定值为1;若想使18,即10010的低4位改为1,则只需和13(1101)进行按位或运算即可。

  • ^ 异或运算符:两位值不同,结果为1,否则为0。

作用:

1 . 交换两个值,不用临时变量;

举栗子说明
a=3 (011), b=5 (101);      
a=a^b;                  
b=a^b;               
b=a^b;        
另一种方式
a=a+b; 
b=a-b;
a=a-b;
  • ~ 取反运算符:将0变1,1变0;用于求整数的二进制反码。

  • << 左移运算符:各二进制位全部左移若干位,左边丢弃,右边补0。

  • >> 右移运算符:各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

  • 两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。短的那个数据如果是负数,左边补1,否则补0。

-------------完-------------