位运算使用技巧及巧解算法题
位运算
简单的复习一下基本的位运算,这些使用技巧在下面都有用到。
// 按位与 & , 双1得1, 其他都得0,使用:比如设置某些位为0,或者取某些位
// 按位或 | , 单1即可得1, 只有双0才得0,使用:比如设置某些位为1
// 异或 ^ , 相同则为0,相反则为1,即 10相碰得1,使用:比如取某些位的相反位
//下面这四个一般用来构造某些特殊的二进制数
// 按位取反 ~ 很简单,取反即可
// 左移 << 把数向左移,右边空出来的补0
// (无符号数)逻辑右移 >> 把数往右移,左边空出来的补0,注意在C中只有无符号数才如此
// (有符号数)算术右移 >> 把数往右移,左边空出来的补符号位,即正数补0,负数补1,有符号数执行的是算术运算
// 在其他语言中可能有不同,比如Java中算术右移和逻辑右移就是不同的运算符: >>和>>>
简单技巧
- 判断整型的奇偶
if (x & 1)
// 奇数
else
// 偶数
- 将一个数符号取反,即取相反数
int x;
x = ~x+1; //相反数
- 判断第n位是否设置为1
if (x & (1 << n))
// 是
else
// 否
- 将第n位设置为1
x = x | (1 << n)