基本知识
最近博主在刷Leedcode题,很多人都是采用位运算来解题的,看的我满脸雾水,所以上网收集了一下c++中关于位运算的知识,为此总结一下,有不妥的地方还望指正。
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。[百度百科]
下面的a和b都是整数类型,则:
位运算分析
1. 与运算&
双目运算。二个位置位等于1时,结果等于1,其它的结果都等于0。
a | b | result |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
(1)例子说明
11&3 = 3
00001011
& 00000011
= 00000011 = 3
(2)与运算用途
i. 我们判断一个数是否被2整除,一般都写成 if(n % 2 == 0)现在可以换成 if((n&1) == 0)
换句话说,这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数是偶数,最末位为1表示该数为奇数。
ii与运算的一个用途是检查指定位是否置位(等于1)。例如一个BYTE里有标识位,要检查第4位是否置位,代码如下:
BYTE b = 50;
if ( b & 0x10 )
cout << "Bit four is set" << endl;
else
cout << "Bit four is clear" << endl;
上述代码可表示为:
00110010 - b
& 00010000 - & 0x10
----------------------------
00010000 - result
可以看到第4位是置位了。
2.或运算 |
双目运算。二个位只要有一个位置位为1,结果就等于1。二个位都为0时,结果为0。
a |
---|