位运算概览
1.&:与操作 两个位都为1时,结果才为1
2.|:或操作 两个位都为0时,结果才为0
3.^:异或操作 两个位相同为0,相异为1
4.~:取反 0->1 1->0
5.<< :左移 各二进位全部左移若干位,高位丢弃,低位补0
6.>> :右移 各二进位全部右移若干位,对无符号数,高位补0
位运算操作
1. 按位与运算符(&)
规则:与操作 两个位都为1时,结果才为1
0&0=0 0&1=0 1&0=0 1&1=1
example: 3 & 5 = 1
0000 0011 &
0000 0101 =
0000 0001 = 1
!!!: 负数按补码形式参加按位与运算
用途
- 清零
如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
0101 0010 & 0000 0000 = 0000 0000
- 取一个数的指定位
比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位与运算(X&Y=0000 1110)即可得到X的指定位。
总结:要取那几位,就与上哪几位全是1的二进制数
- 判断奇偶
只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数
因为偶数的二进制数最后一位一定为0
用 if((a & 1) == 0) 代替 if(a % 2 == 0) 判断a是否为偶数
2.按位或运算符(|)
规则:或操作 两个位都为0时,结果才为0
0|0=0 0|1=1 1|0=1 1|1=1
总结:参加运算的两个对象只要有一个为1,其值为1
example: 3 | 5 = 7
0000 0011 |
0000 0101 =
0000 0111 = 7
!!!: 负数按补码形式参加按位或运算
用途
-
对一个数据的某些位置设为1
比如将数 X=1010 1110 的低4位设置为1,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位或运算(X|Y=1010 1111)即可得到
总结:要设置哪几位为1,就或上哪几位全是1的二进制数
3.异或运算符(^)
规则: 异或操作 两个位相同为0,相异为1
异或的几条性质:
1、交换律
2、结合律 (a^ b)^ == a^ (b^c)
3、对于任何数x,都有 x^ x=0,x^0=x
4、自反性: a^ b^ b =a^0=a;
用途:
- 翻转指定位
比如将数 X=1010 1110 的低4位进行翻转,只需要另找一个数Y,令Y的低4位为1,其余位为0, 即Y=0000 1111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到。
总结:想要翻转哪几位数,就按位异或上哪几位数字
-
与0相异或值不变
1010 1110 ^ 0000 0000 = 1010 1110
4.取反运算符(~)
规则: 取反 0->1 1->0
总结:对一个二进制数按位取反,即将0变1,1变0
用途:
- 使一个数的最低位为零
使a的最低位为0,可以表示为:a &~ 1。 ~1的值为 1111 1111 1111 1110,再按"与"运算,最 低位一定为0。因为“ ~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高
5.左移运算符(<<)
规则:左移 各二进位全部左移若干位,高位丢弃,低位补0
设 a=1010 1110,a = a<< 2 将a的二进制位左移2位、右补0,即得a=1011 1000
每移一位,相当于这个数 x2
6.右移运算符(>>)
规则:右移 各二进位全部右移若干位,对无符号数,高位补0
a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负
a=1010 1110,a = a<<2 , 所以a=1011 1000
操作数每右移一位,相当于该数除以2
整理资料来源感谢:https://blog.youkuaiyun.com/scarificed/article/details/112972923