C语言位操作初步
操作含义&按位与|按位或^按位异或~取反<<左移>>右移
这些操作用于整型或者字符型
1、按位与(&)
Bit1Bit2Bit1 & Bit2000010100111通常我们可把按位“与”操作 & 作为关闭某位(即将该位置0)的手段,例如我们想要关闭a数中的第3位,而又不影响其它位的现状,可以用一个数0xF7,即二进制数1111 0111去与a数作按位“与”运算:
??? 0x88 1000 1000 a数
& 0xF7 1111 0111 屏蔽数
?? =?????? 1000 0000
注意,这个数除第3位为0外,其它各位均为1,操作的结果只会将a数中的第3位置0,而a数的其它位不受影响。也就是说,若需要某个数的第n位关闭,只需要将该数与另一个数按位相与,另一个数除了相应的第n位为0外,其它各位都为1,以起到对其它各位的屏蔽作用。
应用举例:判断一个数字的奇偶性
由于在二进制下,当最后一个数字为0,则此数字为偶数,若为1则此数为奇数
代码如下:
Bit1Bit2Bit1 | Bit2000011101111通常我们可把按位“或”操作 | 作为置位(即将该位置1)的手段,例如我们想要将a数中的第0位和1位置1,而又不影响其它位的现状,可以用一个数0x03,即二进制数00000011去与a数作按位“或”运算:
? 0x88 1000 1000 a数
| 0x03 0000 0011 屏蔽数
?? =???? 1000 1011注意,这个数除第0、1位为1外,其它各位均为0,操作的结果只会将a数中的第0、1位置1,而a数的其它位不受影响。也就是说,若需要某个数的第n位置1,只需要将该数与另一个数按位相“或”,另一个数除了相应的第n位为1外,其它各位都为0,以起到对其它各位的屏蔽作用。
3、按位异或(^)
Bit1Bit2Bit1 ^ Bit2000011101110?
按位“异或”运算 ^ 具有一些特殊的应用,介绍如下:
① 按位“异或”运算可以使特定的位取反
例如:我们想让a数中的最低位和最高位取反,只要用0x81,即二进制数10000001去与它作按位“异或”运算,其运算结果同上式。经过操作后,最高位的值已经由1变0,而最低位的值也已经由0变1,起到了使这两位翻转的效果。其它位的状态保持不变。
可以看到,这个数除最低位、最高位为1外,其它各位均为0,操作的结果只会将a数中的第0、7位取反,而a数的其它位不受影响。也就是说,若需要某个数的第n位取反,只需要将该数与另一个数按位相“异或”,另一个数除了相应的第n位为1外,其它各位都为0,以起到对其它各位的屏蔽作用。上面的运算可以用a = a ^ (0x81) 来表示,也可以用a ^ =(0x81) 来表达。② 直接交换两个变量的值
例如,若有变量a = 3,b = 4,想要交换它们的值,可以做如下一组操作:
a ^ = b
b ^ = a
a ^ = b首先,a ^ = b:
??? a 0000 0011
^ b?0000 0100
a =?0000 0111其次,b ^ = a:
??? b 0000 0100
^ a? 0000 0111
b =? 0000 0011最后,a ^ = b:
??? a 0000 0111
^ b? 0000 0011
a =? 0000 0100这样,a、b两个变量中的值就进行了对调。
4、按位取非(~)
Bit~Bit01105、左移操作(<<)与右移操作(>>)
对于x,x<<n相当于x^n,x>>n相当于x/(2^n)
6、右移操作详解:
右移操作相当的诡异,当一个变量进行右移操作,C语言需要填充左边空的比特位
然而对于有符号变量,C使用符号位,如下表:
?signed charsigned charunsigned char表达式9>>2-8>>2248>>2Binary Value>>20000 1010>>21111 1000>>21111 1000>>2结果??00 0010??11 1110??11 1110填充Sign Bit(0)Sign Bit(1)0最终结果(二进制)0000 00101111 11100011 1110最终结果(短整型)2-262