位运算
1. 按位与 &
通常将某变量的某些位清零且保持其他位不变,也可以用来获取变量中的某一位。
eg:
n = n & 0xffffff00;
n&= 0xffffff00; //将int型变量n的低8位全置成0,而其余位不变
n&=0xff00 //如果n是short型的,则只需执行此步。因为short类型只有16位
判断一个int型变量n的第7位(从右往左,从0开始数)是否为1?只需判断 “n&0x80”的值是否等于0x80即可
2. 按位或 |
将参与运算的两操作数各对应的二进制位进行或操作,只有两个位二进制位都为0时,结果才是0,否则为1.
通常用来将某变量中的某些位置1且保留其他位不变。
n | =0xff; 将int类型变量n的低8位全置为1,而保留其余位不变。(0xff:1111 1111)
3. 按位异或 ^
只有对应二进制位不同时,结果的对应二进制位才是1,否则为0.
取反位与1异或,保留位与0异或。
21 ^ 18 的值是7:
21: 0000 0000 0000 0000 0000 0000 0001 0101
18: 0000 0000 0000 0000 0000 0000 0001 0010
21^18: 0000 0000 0000 0000 0000 0000 0000 0111
n ^ = 0xff; //将int型变量n的低8位取反,而其余位不变。(0xff:1111 1111)
异或运算可以不通过临时变量就交换两个变量的值:
int a=5,b=7;
a=a^b;
b=b^a;
a=a^b;
即实现a,b值交换。
4. 按位非 ~
将操作数中的二进制位0变成1,1变成0.
21:0000 0000 0000 0000 0000 0000 0001 0101
~21:1111 1111 1111 1111 1111 1111 1110 1010,即整型数0xffffffea
5. 左移 <<
a<<b:表示将a各二进制位全部左移b位后得到的值。左移时,高位丢弃,低位补0。a的值不因运算而改变。
eg:
9: 0000 0000 0000 0000 0000 0000 0000 1001
9 << 4:0000 0000 0000 0000 0000 0000 1001 0000,即10进制的144
6. 右移 >>
a>>b:表示将a各二进制位全部右移b位后得到的值。右移时,移出最右边的位就被丢弃。a的值不因运算而改变。
对于有符号数,如long,int,short,char类型变量,右移时,符号位(最高位)将一起移动,并且大多数c/c++编译器规定,如果原符号位为1,则右移时最高位就补充1;原符号位为0,则右移时最高位就补充0.
实际上,右移n位,就相当于左操作数除以$$2^{n}$$,并且将结果往小里取整。
eg:
-25 >> 4 = -2
-2 >> 4 = -1
18 >> 4 = 1