按位与运算符(&):
两位同时为1,结果才为1,否则结果为0。
用途:
1)清零
如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
2)取一个数的指定位
比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位与运算(X&Y=0000 1110)即可得到X的指定位。
3)判断奇偶
只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数。
按位或运算符(|):
两位只要有一个为1,其值为1。
用途:
1)常用来对一个数据的某些位设置为1
比如将数 X=1010 1110 的低4位设置为1,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位或运算(X|Y=1010 1111)即可得到。
异或运算符(^):
两位相同则为0,相异则为1。
异或的几条性质:
1、结合律 (a^b)^c == a^(b^c)
2、对于任何数x,都有 x^x=0,x^0=x
3、自反性: a^b^b=a^0=a;
用途:
1)翻转指定位
比如将数 X=1010 1110 的低4位进行翻转,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到。
2)与0相异或值不变
例如:1010 1110 ^ 0000 0000 = 1010 1110
3)交换两个数
void Swap(int &a, int &b){
if (a != b){
a ^= b;
b ^= a;
a ^= b;
}
}
取反运算符 (~):
按位取反,即将0变1,1变0。
用途:
1)使一个数的最低位为零
使a的最低位为0,可以表示为:a & ~1。~1的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0。因为" ~"运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。
左移运算符(<<):
定义:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
设 a=1010 1110,a = a<< 2 将a的二进制位左移2位、右补0,即得a=1011 1000。
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
右移运算符(>>):
定义:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
例如:a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负。
操作数每右移一位,相当于该数除以2。
复合赋值运算符:
位运算符与赋值运算符结合,组成新的复合赋值运算符,它们是:
&= 例:a&=b 相当于 a=a&b
|= 例:a|=b 相当于 a=a|b
>>= 例:a>>=b 相当于 a=a>>b
<<= 例:a<<=b 相当于 a=a<<b
^= 例:a^=b 相当于 a=a^b
实列应用:
0和1切换
x ^ 1 = 1 ^ 1 = 0
x ^ 1 = 0 ^ 1 = 1
权限值应用
1 = 001
2 = 010
4 = 100
添加权限,权限值相加
7 = 1 + 2 + 4 = 001 | 010 | 100 = 111
删除权限,权限值相减,位运算与顺序无关
7 - 4 = 3 => 7 ^ 4 = 111 ^ 100 = 4 ^ 7 = 100 ^ 111 = 011 = 010 + 001
7 - 4 = 3 => 7 & ~4 = 111 & ~100 = ~4 & 7 = ~100 & 111 = 111 & 011 = 011
判断是否有权限
小权限值&大权限值=小权限值,则说明有权限。实际可以判断 小权限值&大权限值>0,就说明有权限。因为不同的权限值就是在不同的位置1。
小权限值&大权限值=0,则说明无权限
4 & 7 = 4 => 100 & 111 = 100 = 4
2 & 4 => 010 & 100 = 000 = 0
2 & 5 => 010 & 101 = 000 = 0
两位同时为1,结果才为1,否则结果为0。
用途:
1)清零
如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
2)取一个数的指定位
比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位与运算(X&Y=0000 1110)即可得到X的指定位。
3)判断奇偶
只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数。
按位或运算符(|):
两位只要有一个为1,其值为1。
用途:
1)常用来对一个数据的某些位设置为1
比如将数 X=1010 1110 的低4位设置为1,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位或运算(X|Y=1010 1111)即可得到。
异或运算符(^):
两位相同则为0,相异则为1。
异或的几条性质:
1、结合律 (a^b)^c == a^(b^c)
2、对于任何数x,都有 x^x=0,x^0=x
3、自反性: a^b^b=a^0=a;
用途:
1)翻转指定位
比如将数 X=1010 1110 的低4位进行翻转,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到。
2)与0相异或值不变
例如:1010 1110 ^ 0000 0000 = 1010 1110
3)交换两个数
void Swap(int &a, int &b){
if (a != b){
a ^= b;
b ^= a;
a ^= b;
}
}
取反运算符 (~):
按位取反,即将0变1,1变0。
用途:
1)使一个数的最低位为零
使a的最低位为0,可以表示为:a & ~1。~1的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0。因为" ~"运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。
左移运算符(<<):
定义:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
设 a=1010 1110,a = a<< 2 将a的二进制位左移2位、右补0,即得a=1011 1000。
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
右移运算符(>>):
定义:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
例如:a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负。
操作数每右移一位,相当于该数除以2。
复合赋值运算符:
位运算符与赋值运算符结合,组成新的复合赋值运算符,它们是:
&= 例:a&=b 相当于 a=a&b
|= 例:a|=b 相当于 a=a|b
>>= 例:a>>=b 相当于 a=a>>b
<<= 例:a<<=b 相当于 a=a<<b
^= 例:a^=b 相当于 a=a^b
实列应用:
0和1切换
x ^ 1 = 1 ^ 1 = 0
x ^ 1 = 0 ^ 1 = 1
权限值应用
1 = 001
2 = 010
4 = 100
添加权限,权限值相加
7 = 1 + 2 + 4 = 001 | 010 | 100 = 111
删除权限,权限值相减,位运算与顺序无关
7 - 4 = 3 => 7 ^ 4 = 111 ^ 100 = 4 ^ 7 = 100 ^ 111 = 011 = 010 + 001
7 - 4 = 3 => 7 & ~4 = 111 & ~100 = ~4 & 7 = ~100 & 111 = 111 & 011 = 011
判断是否有权限
小权限值&大权限值=小权限值,则说明有权限。实际可以判断 小权限值&大权限值>0,就说明有权限。因为不同的权限值就是在不同的位置1。
小权限值&大权限值=0,则说明无权限
4 & 7 = 4 => 100 & 111 = 100 = 4
2 & 4 => 010 & 100 = 000 = 0
2 & 5 => 010 & 101 = 000 = 0