C++基础---位操作符

1. 位操作符

1.1 位操作的定义

  • 位操作:整数特有的操作
  • 位操作:<< 、>>、&、|、^、~共六个操作。

1.2 左移操作

  • 左移操作“<<”:将整数最高位(左端)挤掉,而在右端补0。

    short int a = 12;//a为0000000000001100
    a = a<<1;        //a为0000000000011000
    =>得到a=24;
      左移1位相当于乘2,不管整数a是否有符号。 

1.3 右移操作

  • 右移操作“>>”:是在整数的高位挤一个0或1进去,而整数右边的1或0被挤掉。
    有符号整数,若最高位是1,则高位挤进1,若最高位是0,则高位挤进0。
    无符号整数,则一律高位挤进0。

    short int a = -2;//a为1111111111111110
    a = a>>1;        //a为1111111111111111 
    =>得到a=-1;
    unsigned short int b=65535;//b为1111111111111111
    b = b>>1;                  //b为0111111111111111 
    =>得到b=32767;

1.4 位与操作

  • 位与操作“&”:将两个操作数每一位做与操作。

    short int a=12;           //a为0000000000001100
    short int b=6;&emsp;&ensp;//b为0000000000000110
    a = a & b;                //a为0000000000000100
    =>得到a=4;

1.5 位或操作

  • 位或操作“|”:将两个操作数每一位做或操作。

    short int a=12;//a为0000000000001100
    short int b=6; //b为0000000000000110
    a = a | b;     //a为0000000000001110
    =>得到a=14;

1.6 位异或操作

  • 位异或操作“^”:将两个操作数每一位做异或操作,异或也称对称和,或称无进位加等,若两个操作数相等(都为0或都为1,则其值为0,否则为1),对应位不同取1,对应位同为1取反为0,对应位同为0不做处理。

    short int a=12;//a为0000000000001100
    short int b=6; //b为0000000000000110
    a = a ^ b;     //a为0000000000001010
    =>得到a=10;

1.7 位反操作

  • 位反操作“~”:将一个操作数每一位取反,0变成1,1编程0。

    short int a=12;//a为0000000000001100
    a = ~a ;       //a为1111111111110011
    =>得到a=-13;

1.8 位操作也有对应的复合赋值操作

  • a <<= 5; <=> a = a << 5;
  • a >>= 5; <=> a = a >> 5;
  • a &= b;  <=> a = a & b;
  • a |= b;  <=> a = a | b;
  • a ^= b;  <=> a = a ^ b;

1.9 位操作实例

  • 位操作可以帮助实现一些很强调空间的计算,系统编程中的状体位截取肯定用位操作,它也是标准库中bitset容器类的实现基础,有许多问题用位操作实现颇为有效。

    
    #include<iostream>
    
    using namespace std;
    void print(int n)
    {
        cout<<(n&16 ? "A":"~A")<<" "
            <<(n&8  ? "B":"~B")<<" "
            <<(n&4  ? "C":"~C")<<" "
            <<(n&2  ? "D":"~D")<<" "
            <<(n&1  ? "E":"~E")<<" "
            <<endl;
    }
    int main()
    {
        for(int n=0; n<32; n++)
        {
            bool A=n&16, B=n&8, C=n&4, D=n&2, E=n&1;
            if(A && !B) continue;
            if(!D && !E) continue;
            if(B == C) continue;
            if(C != D) continue;
            if(E && !(A && B)) continue;
            print(n);
        }
    
        system("pause");
        return 0;
    }
    =>编译警告:
    1>warning C4800: “int”: 将值强制为布尔值“true”或“false”(性能警告)
    1>warning C4800: “int”: 将值强制为布尔值“true”或“false”(性能警告)
    1>warning C4800: “int”: 将值强制为布尔值“true”或“false”(性能警告)
    1>warning C4800: “int”: 将值强制为布尔值“true”或“false”(性能警告)
    =>~A ~B   C    D ~E
       A  B  ~C   ~D  E

参考文献:
[1]《C++程序设计教程(第二版)》钱能——第四章
[2] 百度搜索关键字:C++运算符、位操作符、位操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值