C++位操作
位操作有哪些
实际上并不多:
& 逻辑与
| 逻辑或
~ 逻辑非
^ 逻辑异或
<<左移
>>
右移
二进制数
C++貌似不支持二进制数的定义,但是不要紧,我们完全可以使用十进制数,但是脑内模拟二进制数
奇技淫巧
- 二进制数求指数:
m >>= n 将m除2^n
m <<= n 将m乘以2^n
注意:负奇数的除法是向上取整,右移是向下取整,即:-3 / 2 = -1,-3>>2 = -2 - 二进制中1的个数求解:
(m = m&(m - 1))
每次执行一次这个操作,最右边的1将变为0,因此可以计数1的个数
例:101执行一次后变为100,再执行一次后变为000
1101执行一次后变为1100,再执行一次后变为1000,再执行一次后变为0000
- 判断奇偶数:
x & 1 == 1
(判断是否为奇数)
偶数最右为0,奇数为1, - 交换两个数(无需新变量):
x = x ^ y; y = x ^ y; x = x ^ y;
- 判断符号(正负性)是否相同:
(x ^ y) >= 0
同负同正时,异或为假—>即结果为0,即:符号位得0(即正数),结果大于0 - 改变二进制的第n位数:
x |=(1<<n) //第n位改为1 //注:0位为最右边的那位 x &=(~(1<<n)) //第n位改为0 //注:虽然是二进制运算,但实际上是拿十进制去算
如将1101B(13D)的第1位改为1:
13|(1<<1)
—>结果为1111即:15