CC++ 位运算 逻辑运算符和移位运算符

    技术2022-07-10  109

    简介

    学会位操作在一些情况下可以很好提升程序的效率。 逻辑运算符有 &(与),|(或),~(去反),^(异或) 位移运算符有 <<(左移),>>(右移) 以上除了~都是二目运算符

    逻辑运算符

    &(与)

    &运算:位运算时两边都是1时为1,否则为0 1&1 = 1 1&0 = 0 0&1 = 0 0&0 = 0 应用:&1可以用来判断一个数是奇数还是偶数 因为奇数的的二进制的最后一位必定是1,偶数是0

    int型(32位) 8的二进制 :00000000 00000000 00000000 0000100 1的二进制 :00000000 00000000 00000000 0000001 8&1二进制 :00000000 00000000 00000000 0000000

    //举例 int a = 8; if(a&1) cout<<"该数是奇数"; else cout<<"该数是偶数";
    |(或)

    |运算:两边有一个1则运算结果为1 1|0=1 0|1=1 1|1=1 0|0=0 或运算可以用来指定某些位为1 比如0001(2)让第三第四位为1只需 | 0110即可

    ^(异或)

    ^运算:两边的数不同则为1,否则为0 0^1=1 1^0=1 1^1=0 0^0=0 异或可以用在加密上,比如一个数 a,经过key数加密后即a ^key发送,接收者再将该数与key做异或,a ^key ^key = a。很好理解^ 满足交换律,key ^ key=0,a^0=a。

    ~(取反)

    取反:单目运算符,0取反后为1,1取反后为0

    移位运算符

    <<(左移):各二进位全部左移若干位,高位丢弃,低位补0 >>(右移):各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

    左移和右移的使用方式有很多,合理的使用能很大效虑的减少程序运行的时间,下面举几个简单常用的例子:

    当要做一下乘除二的次幂的操作时可以使用 “<<” 左移一位即乘2 比如求m乘2的n次方 m<<n “>> " 右移一位即除二(逻辑右移时) 比如求m除以2的n次 m>>n 获得int,long等类型最大值,最小值 其实就是当我们知道一个类型它占多少个字节数即可,比如int型4个字节也就是32位,第一位用来表示符号位于是就可以有

    int MinInt = 1<<31; //0x8000 0000 表示的是最小的数(这块是补码的知识,不多余解释) int MaxInt = ~MinInt;//取反即为最大值

    补充 补充一个bitset方便测试 C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。 下面是具体用法 bitset常用构造函数

    bitset<8> bitset1;  //无参构造,长度为8,默认每一位为0 bitset<8> bitset2(4);  //长度为8,将4以二进制保存,前面用0补充 string s = "100001"; bitset<10> bitset3(s);  //长度为10,前面用0补充 char s1[] = "1001"; bitset<10> bitset4(s1);  //长度为13,前面用0补充 cout << bitset1 << endl;  //00000000 cout << bitset2 << endl;  //00000100 cout << bitset3 << endl;  //0000100001 cout << bitset4 << endl;  //0000001001 int a = 1<<31; cout<<(bitset<32>)a<<endl; a = ~a; cout<<(bitset<32>)a<<endl; cout<<oct<<a<<" "<<hex<<a;
    Processed: 0.008, SQL: 9