问题:
一行代码,判断给定的整数是否是一个2的幂。
计算机基本运算
仅对寄存器中的数据进行运算
计算机中最基本的操作,一个时钟周期完成
需要控制信号
按位运算(C语言符号) – 针对二进制
按位与(&)
A B A&B 0 0 0 0 1 0 1 0 0 1 1 1 按位与可以实现功能:
提取二进制数中的指定位。1101 1001 &0000 1111 0000 1001
按位或(|)
功能:
特定位上的无条件赋值1101 1000 |0000 0001 1101 1001
按位取反(~)
按位异或(^)
功能:判断两个二进制数是否相等
1101 1000 ^1101 1000 0000 0000
按位取反
1101 1000 ^1111 1111 0010 0111
逻辑运算 – 针对表达式返回值(只有真1和假0)进行操作
- 逻辑与(&&)
- 逻辑或(||)
- 逻辑非(!)
- 移位运算
移位本身不区分算术、逻辑移位,可用于实现提取信息时候使用
- 算术移位 – 二进制有符号数
- 算术左移(<<)
高位移出,地位补0。
功能:
乘以2
溢出判断:若移出的位不等于新的符号位,则移出。 - 算术右移
右移时注意符号位问题。低位移出,高位补数符。可能发生数据丢失。
功能:
除以2
- 算术左移(<<)
- 逻辑移位 – 二进制无符号数(比如地址值)
无符号数逻辑左(右)移,高(低)位移出,低(高)位补0。
若高位移出的是1,则左移时发生溢出!
- 逻辑左移
功能同算术运算 - 逻辑右移
功能同算术运算
- 逻辑左移
- 算术移位 – 二进制有符号数
答案:
(b & (b-1)) == 0
提示:所有的2的幂二进制都是最高位为1,其余位为0,形如10…00;当进行减一后,形如01…11,然后进行按位与操作,判断结果是否等于0。