程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。
num&1 奇数返回1 偶数返回0 0 返回0
~num + 1
<< 1, 2, 3, 4, 5
>> 1, 2, 3, 4, 5
a = a^b b = b^a a = a^b
思路解析: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 & (x-1) 如: x = 1100 x-1 = 1011 x&(x-1) = 1000
C语言运算符优先级口诀:“单算移关与,异或逻条赋”。 * “单”表示单目运算符:逻辑非(!),按位取反(~),自增(++),自减(–),取地址(&),取值(*); * “算”表示算术运算符:乘、除和求余(*,/,%)级别高于加减(+,-); * “移”表示按位左移(<<)和位右移(>>) * “关”表示关系运算符:大小关系(>,>=,<,<=)级别高于相等不相等关系(==,!=); * “与”表示按位与(&); * “异”表示按位异或(^); * “或”表示按位或(|); * “逻”表示逻辑运算符:逻辑与(&&)级别高于逻辑或(||); * “条”表示条件运算符(? :); * “赋”表示赋值运算符(=,+=,-=,*=,/=,%=,>>=,<<=,&=,^=,|=,!=); * 逗号运算符(,) 级别最低