通过在leetcode上面做题发现,位操作是一个非常实用但是容易被忽略的技巧。
所以在这篇文章中归纳常用的位操作基础和技巧,并通过例子来直观地理解位操作的实际应用。
在计算机中所有数据都是以二进制的形式储存的。位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。在实际编程中,如果能巧妙运用位操作,完全可以达到四两拨千斤的效果。因此本文将对位操作进行如下方面总结:
一、位操作基础:用一张表描述位操作符的应用规则并详细解释。
二、常用位操作小技巧:判断奇偶、判断一个数是否是2的方幂、计算二进制中1的个数。
一、位操作基础
需要注意:
1、位操作只能用于整形数据,对float和double类型进行位操作会被编译器报错。
2、位操作符的运算优先级比较低,应尽量使用括号来确保运算顺序。
3、位操作还有一些复合操作符,如&=、|=、 ^=、<<=、>>=。
二、常用位操作小技巧
1、判断奇偶
只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数。
下面程序将举例如何应用:
int a;
if (a & 1) {
cout << "a是奇数" << endl;
}
if ((a & 1) == 0) {
cout << "a是偶数" << endl;
}
2、判断一个数是否是2的方幂
首先要理解n&(n-1)作用:将n的二进制表示中的最低位为1的改为0。
举个例子:
n = 10100(二进制),则(n-1) = 10011 ==> n&(n-1) = 10000
可以看到原本最低位为1的那位变为0。
该问题的代码为:
n > 0 && ((n & (n - 1)) == 0 )
如果((n & (n-1)) == 0),则二进制的最高位为1,其余位均为0,所以n是2的幂。
3、计算二进制中1的个数
代码如下:
while (n > 0) {
count++;
n &= (n-1);
}
该技巧的应用可以参考leetcode上的《461. Hamming Distance》。