一、逻辑运算符(位运算符)
符号 | 运算符 | 参与运算的数的形式 |
---|---|---|
| | 按位或 | 有1则1 |
& | 按位与 | 有0则0 |
^ | 按位亦或 | 相同为0,不同为1 |
~ | 按位取反 | 1变0,0变1 |
<< | 左移 | 各二进位全部左移指定的位数,高位丢弃,低位补0(相当于×2^(位数)) |
>> | 右移 | 各二进位全部右移指定的位数,低位丢弃,正数高位补0,负数高位补1(相当于÷2^(位数)) |
位运算符将数字转化成二进制数的补码来进行运算。
注意:这是有符号位的二进制数,符号位是第一位二进制数(最左边的),符号位为1表示负数,符号位为0表示正数。
原码、补码、反码、移码:https://blog.csdn.net/sandalphon4869/article/details/89395749#1_80
int a=4,b=8;
//4为0100,8为1000
cout<<(a|b)<<endl;
//按位或:0000 0100 | 0000 1000为0000 1100 ,即12
cout<<(a&b)<<endl;
//按位与:0000 0100 & 0000 1000为0000 0000 ,即0
cout<<(a^b)<<endl;
//按位亦或:0000 0100 ^ 0000 1000为0000 1100 ,即12
cout<<(~b)<<endl;
//按位取反:~0000 1000为1111 0111 (补码),补码1111 0111的原码是1000 1001(1111 0111减1得1111 0110,然后除符号位都取反),即-9
cout<<(a<<2)<<endl;
//左移:a左移两位,0000 0100左移两位是0001 0000,即16
cout<<(b>>2)<<endl;
//正数右移:右移两位,0000 1000右移两位是0000 0010(补)→0000 0010(原)即2
cout<<(-10>>1)<<endl;
//负数右移:右移一位,1111 0110右移一位是1111 1011(补)→1000 0101(原)即-5
二、实际应用
2.按位与&
获取指定位数
获取四位二进制数:
a 0101 1010
b 0000 1111
a&b 0000 1010
奇偶检验:k&1
- k&1为0是偶数
- k&1为1是奇数
原理:
*二进制数的规律:如果一个二进制数(整型)数的第零位的值是1,那么这个数就是奇数;而如果该位是0,那么这个数就是偶数。*所以获取第零位就知道其奇偶性。
int a=30,b=41;
cout<<(a&1)<<endl; //0
cout<<(b&1)<<endl; //1
3.按位亦或^
0^k=k
int a=10;
cout<<(a^0)<<endl;
//10是0000 1010,0是0000 0000,a^0=0000 1010,即10
连续按位亦或2次,得原数
int x=5,y=8;
x^=y;
cout<<x<<endl; //13
x^=y;
cout<<x<<endl; //5
a和b交换
int a=30,b=4;
a^=b;
cout<<a<<" "<<b<<endl;
//26 4
b^=a;
cout<<a<<" "<<b<<endl;
//此时的b,相当于a连续按位亦或两次(b^=a即b=b^a=b^(a^b)=a)
//26 30
a^=b;
cout<<a<<" "<<b<<endl;
//4 30
//此时对a,相当于b连续按位亦或两次(a^=b即a=a^b=(a^b)^(a)=b)