按位与运算符(&):

两位同时为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


posted on 2022-08-31 11:17  lbnnbs  阅读(53)  评论(0编辑  收藏  举报