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