位操作的基础与应用举例

来源:互联网 发布:免费的音乐软件 编辑:程序博客网 时间:2024/05/24 03:22
通过在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》。

0 0