位运算
用位运算代替普通运算可以加快运算速度
位运算基础
>>n
右移n位,舍去末n位
>>=n
右移n位并赋值
<<n
左移n位,末尾添0
<<=n
左移n位并赋值,相当于乘以2^na<<=1
等价于a*=2
&
按位与
^
按位异或,异或运算真值表如下
A | B | res |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
|
按位或
~
按位取反(只有这个是一元运算符)
加减
a+b=a^b+(a&b)<<1
a^b
等价于不考虑进位时的a+b
(a&b)<<1
进位操作,两个数此位都是1时才进位,按位与也一样(都为一才为一)。再把结果左移一位,完成进位
减法把减数按位取反之后同加法。
计算一个数(B)中有多少1
1 | while (x) |
运行完后count
的值就是1的个数。
如果count
为0,则x
为2的整数指数幂。