什么是位运算?
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。
奇偶校验:
num&1 奇数返回1 偶数返回0 0 返回0
绝对值
~num + 1
乘 2, 4, 8, 16, 32
<< 1, 2, 3, 4, 5
除 2, 4, 8, 16, 32
>> 1, 2, 3, 4, 5
交换两数值,不引入中间变量:
a = a^b
b = b^a
a = a^b
判断是否位2的幂次
思路解析:N如果是2的幂次,则N满足两个条件。
1.N>0
2.N的二进制表示中只有一个1
一位N的二进制表示中只有一个1,所以使用N&(N-1)将唯一的一个1消去。
如果N是2的幂次,那么N&(N-1)得到结果为0,即可判断。
def is_pow2(num):
return (n & (n-1) == 0)
消除x的最后一位的1
x & (x-1)
如:
x = 1100
x-1 = 1011
x&(x-1) = 1000
C语言运算符优先级口诀:“单算移关与,异或逻条赋”。
- “单”表示单目运算符:逻辑非(!),按位取反(~),自增(++),自减(–),取地址(&),取值(*);
- “算”表示算术运算符:乘、除和求余(*,/,%)级别高于加减(+,-);
- “移”表示按位左移(<<)和位右移(>>)
- “关”表示关系运算符:大小关系(>,>=,<,<=)级别高于相等不相等关系(==,!=);
- “与”表示按位与(&);
- “异”表示按位异或(^);
- “或”表示按位或(|);
- “逻”表示逻辑运算符:逻辑与(&&)级别高于逻辑或(||);
- “条”表示条件运算符(? :);
- “赋”表示赋值运算符(=,+=,-=,*=,/=,%=,>>=,<<=,&=,^=,|=,!=);
- 逗号运算符(,) 级别最低