一、和(“&”)
- 理解:如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。
举例:11 & 3 = 00001011& 00000011 = 00000011 = 3.- 应用:判断奇偶数 if((n&1) == 0) 等价于 if(n % 2 == 0)
二、或(“|”)
1.理解:如果两个相应的二进制位只要有一个是1,结果就是1;否则为0。
举例:11 | 3 = 00001011| 00000011 = 00001011 = 11.
三、向左移位移(“<<”)
- 理解:向左移一位,右边自动补0
举例: 11 << 1 = 2200001011 << 1
00010110 = 22
四、向右位移(“>>”)五、异或(“^”)xor、eor、⊕
1、理解:两个元素,相同时为真,不同时为假。
2、异或运算法则
①. 交换律a ^ b = b ^ a
②. 结合律a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
③. d = a ^ b ^ c 可以推出 a = d ^ b ^ c.
④. a ^ b ^ a = b.
⑤.a ^ 1 = a’ , a ^ 0 = a , a ^ a = 0 , a ^ a’ = 1 .3.应用
①. 比较两个值(比减法更快)if ( a^b ==0) return true;
②. 定位翻转
例如:翻转10100001
的第6位, 答案:可以将该数与00100000
进行按位异或运算;
10100001 ^ 00100000 = 10000001
unsigned int a, b, mask = 1 << 6;
a = 0xB1; // 10100001
b = a ^ mask; /* flip the 6th bit */
③.判断一个二进制数中1的数量是奇数还是偶数
例如:求
10100001
中1的数量是奇数还是偶数;答案:
1 ^ 0 ^ 1 ^ 0 ^ 0 ^ 0 ^ 0 ^ 1 = 1
,结果为1
就是奇数个1,结果为0
就是偶数个1;④.交换两个数
a = a ^ b;
b = a ^ b; //a ^ b ^ b = a ^ 0 = a;
a = a ^ b;
⑤寻找单数字比如,从{1, 2, 3, 4, 5, 3, 2, 4, 5}中找出单个的数字: 1
一个for循环,ans=1^2^3^4^……
六、非(“~”)
1.理解:非运算即取反运算,在二进制中1变0,0变1
举例:110101进行非运算后为001010即1010
位运算符小结(运算符理解+使用技巧)
最新推荐文章于 2022-04-07 22:28:16 发布