首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言位操作初始

2013-11-25 
C语言位操作初步操作含义&按位与|按位或^按位异或~取反左移右移这些操作用于整型或者字符型1、按位与(&

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~Bit0110

5、左移操作(<<)与右移操作(>>)

对于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

热点排行