【总结型】c语言中的位运算

位运算包括

复制代码
&
|
^
~
<<
>>

按位与

将某些变量中的某些位清0同时保持其他位不变。也可以用来获取变量中的某一位。

例如:将int型变量n低8位全置为0,其余位保持不变。

n = n & 0xffffff00

如何判断一个int型变量n的第七位。

n & 0x80 的值是否等于0x80

按位或

按位或运算通常用来将某变量中的某些位置置1且保留其他位不变。

例如,如果需要将int型变量n的低8位全置为1,而其他位保持不变

n = n | 0xff

按位异或

按位异或运算通常用来将某些变量中的某些位取反,且保留其他位不变。

例如,如果需要将int型变量n的低8位取反,而其余位不变,则可以执行

n ^= 0xff

异或运算特点:如果a ^ b = c, 那么就有 c ^ b = a 以及 c ^ a = b

另外异或还能实现不通过临时变量,就能交换两个变量的值

int a = 5, b = 7

a= a^b

b= b^a

a= a^b

可以实现a,b值交换

按位非

0变1,1变0

左移运算符<<

左移时,高位丢弃,低位补0,a的值不因运算而改变。左移n位,等于乘以2^n。

右移运算符>>

右移时,移出最右边的位就被丢弃。a的值不因运算而改变。对于有符号数,如long,int,short,char类型变量,在右移时,符号位将一起移动,并且大多数c/c++编译器规定,如果原符号位为1,则右移时高位就补充1,原符号位为0,则右移时高位就补0。右移n位,就相当于左操作数除以2^n,并且结果往小里取整。

思考

有两个int型变量a和n(0 <= n <= 31),要求写一个表达式,使该表达式的值和a的第n位相同。

(a>>n) & 1

或者(a & (1<<n))>>n ,条件是 (0 <= n < 31)