位运算

位运算符

C++ 提供了按位与(&)、按位或(| )、按位异或(^)、取反(~)、左移(<<)、右移(>>)这 6 种位运算符。  这些运算符只能用于整型操作数,即只能用于带符号或无符号的 char、short、int 与 long 类型。
另,负数按补码形式参加按位与运算。

1、按位与运算符(&)

“a&b”是指将参加运算的两个整数a和b,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1; 即:两位同时为“1”,结果才为“1”,否则为0
例如:3&5 即 0000 0011& 0000 0101 = 0000 0001 因此,3&5的值得1。

2、按位或运算符(|) 

参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象只要有一个为1,其值为1。
例如:3|5 即 00000011 | 0000 0101 = 00000111 因此,3|5的值得7。 

3、按位异或运算符(^)

参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0 ^ 0=0; 0 ^ 1=1; 1^ 0=1; 1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
如果是负数:
0000 0101 (5)
^ 1111 1101 (-3)
1111 1000 (结果)

4、按位取反运算符(~)

按位取反运算符(~)是指将整数的各个二进制位都取反,即1变为0,0变为1。
例如,~9=-10,因为9(00001001)所有位取反即为(11110110),这个数最高位是1,所以是补码。补码还原成反码(反码等于补码减1)得到(11110101),再还原为原码(反码到原码最高位不变,其它各位取反)等于(10001010), 十进制为-10。

5、按位左移运算符(<<)

左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。
在高位没有1的情况下,左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15<<2=60,即乘了4。
但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。
例如:143<<2 结果为60 因为143转换为进制为10001111,左移2得00111100 ,结果为60。

6、按位右移运算符(>>)

右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,用符号位填补(即“算术移位”)。
注意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0。
如果符号位原来为1(即负数),则右边移入还是1。

左移运算一律在右端补0,右移运算一律在左端补符号数(负数符号位为1就补1,正数符号位为0就补0)

7、复合赋值运算符

位运算符与赋值运算符结合,组成新的复合赋值运算符,它们是:

1、&= 例:a &=b 相当于a=a& b
2、|= 例:a |=b 相当于a=a |b
3、>>= 例:a >>=b 相当于a=a>> b
4、<<= 例:a<<=b 相当于a=a<< b
5、^= 例:a ^= b 相当 a=a ^b

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main()
{
    int a=3;   //  0000 0011
    printf("%d\n",a);
    a=a>>1;      //右移动一个单位  0000 0001
      printf("%d\n",a);
    a=a<<2;         //左移动一个单位   0000 0100
    printf("%d\n",a);
    a=~a;           //补码1111 1011    反码1111 1010     10000101
    printf("%d\n",a);
    int b=5,c=3;     //0000 0101     00000100
    printf("%d\n",b&c);  //与运算
     printf("%d\n",b|c);  //或运算
    return 0;
}
Scroll to Top