C语言逻辑运算(&&,>>,<<......)

作者在 2010-11-08 09:25:43 发布以下内容

. C语言中的位操作符

因为C语言的设计目的是取代汇编语言,所以它必须支持汇编语言所具有的运算能力,所以C语言支持全部的位操作符

(Bitwise Operators)。位操作是对字节或字中的位(bit)进行测试、置位或移位处理,在对微处理器的编程中,特别适

合对寄存器、I/O端口进行操作。因而本节将对此作比较详细地介绍。

6种位操作符的形式与含义如下:
:按位”(AND)
:按位”(OR)
:按位异或”(XOR)
取反” (NOT)
>> 
:数据右移;
<< 
:数据左移;

1) 按位运算
按位运算符 & 的作用是对运算符两侧以二进制表达的操作数按位分别进行运算,而这一运算是以数中相同

的位(bit)为单位的。操作的规则是:仅当两个操作数都为1时,输出的结果才为1,否则为0
例如:
a = 0x88
b = 0x81,则a & b 的运算结果如下:

    0x88 1000 1000 a
& 0x81 1000 0001 b

   =           1000 0000

其中,运算符让a0x88B0x811位与1位、2位与2……7位与7位分别相。由于运算的操作规则是

,两个操作数中各位只要有1个为0,其结果中对应的位就为0。而a数与b数中只有最高位(7)均为1,因而该位结果为1

,其它各位结果都为0
通常我们可把按位操作 & 作为关闭某位(即将该位置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,以

起到对其它各位的屏蔽作用。
上面的运算可以用a = a &(0xF7) 来表示,也可以用a & =(0xF7) 来表达。这两个表达式功能是相同的(见上节复合赋

值运算符部分),但在源程序代码中常常见到的以第二种形式为多。

2) 按位运算
按位” 运算符 | 的作用是对运算符两侧以二进制表达的操作数按位分别进行运算,而这一运算是以数中相同

的位(bit)为单位的。操作的规则是:仅当两个操作数都为0时,输出的结果才为0,否则为1
例如:
a = 0x88
b = 0x81,则a | b 的运算结果如下:

0x88 1000 1000 a
| 0x81 1000 0001 b

   =           1000 1001

通常我们可把按位操作 & 作为置位(即将该位置1)的手段,例如我们想要将a数中的第0位和1位置1,而又不影响其

它位的现状,可以用一个数0x03,即二进制数00000011去与a数作按位运算:

0x88 1000 1000 a
| 0x03 0000 0011 
屏蔽数
   =           1000 1011

注意,这个数除第01位为1外,其它各位均为0,操作的结果只会将a数中的第01位置0,而a数的其它位不受影响。也

就是说,若需要某个数的第n位置1,只需要将该数与另一个数按位相,另一个数除了相应的第n位为1外,其它各位

都为0,以起到对其它各位的屏蔽作用。上面的运算可以用a = a | (0xF7) 来表示,也可以用a | =(0xF7) 来表达。

3) 按位异或运算
按位异或运算符 ^ 的作用是对运算符两侧以二进制表达的操作数按位分别进行异或运算,而这一运算是以数中

相同的位(bit)为单位的。异或运算操作的规则是:仅当两个操作数不同时,相应的输出结果才为1,否则为0
例如:
a = 0x88
b = 0x81,则a ^ b 的运算结果如下:

    0x88 1000 1000 a
^ 0x81 1000 0001 
屏蔽数
=           0000 1001

按位异或运算 ^ 具有一些特殊的应用,介绍如下:

 按位异或运算可以使特定的位取反
例如:我们想让a数中的最低位和最高位取反,只要用0x81,即二进制数10000001去与它作按位异或运算,其运算结

果同上式。经过操作后,最高位的值已经由10,而最低位的值也已经由01,起到了使这两位翻转的效果。其它位的状

态保持不变。
可以看到,这个数除最低位、最高位为1外,其它各位均为0,操作的结果只会将a数中的第07位取反,而a数的其它位不

受影响。也就是说,若需要某个数的第n位取反,只需要将该数与另一个数按位相异或,另一个数除了相应的第n位为

1外,其它各位都为0,以起到对其它各位的屏蔽作用。上面的运算可以用a = a ^ (0x81) 来表示,也可以用a ^ =

(0x81) 来表达。

 直接交换两个变量的值
例如,若有变量a = 3b = 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

这样,ab两个变量中的值就进行了对调。

4)“取反运算
取反运算符 ~ 的作用是将各位数字取反:所有的0置为11置为0。例如:
1001 0110 
取反后为0110 1001

5) 数据右移
数据右移操作符 > > 将变量的各位按要求向右移动若干位。右移语句的通常形式是:
variable >>
右移位数
如:
a = 1111 0000

进行 a = a >> 2 操作后,a = 0011 1100

6) 数据左移
数据左移操作符 < < 将变量的各位按要求向左移动若干位。左移语句的通常形式是:
variable < <
左移位数
如:
a = 1111 0000

进行 a = a << 2 操作后,a =1100 0000

无论是左移还是右移,当某位从一端移出时,另一端出现的空白将以从外面移入的0(某些计算机是送1,详细内容请查阅

相应

C | 阅读 1637 次
文章评论,共0条
游客请输入验证码