最近在看《技术之瞳》,编程语言部分有一个笔试题目
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。