首页 理论教育C语言程序设计2版:位运算符及表达式

C语言程序设计2版:位运算符及表达式

【摘要】:运算量只能是整型或字符型的数据,不能为实型数据。“按位与”运算通常用来对某些位清0或保留某些位。“按位或”运算常用来对一个数据的某些位定值为1。~取反运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他位运算符都高。若a=a<<2,则将a的二进制数左移2位。例2.7右移实例。

C语言中,所谓的位运算是指进行二进制位的运算。在系统软件中,常常需要处理二进制位的问题。

C语言提供了6个位操作运算符,即:

&     按位与

|      按位或

^      按位异或

~     取反

<<   左移

>>   右移

说明:

(1)位运算符中除~以外,均为二目(元)运算符,即要求位运算符两侧各有一个运算量。

(2)运算量只能是整型或字符型的数据,不能为实型数据。

1.“按位与”运算符( & )

“按位与”是指参加运算的两个数按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1,否则为0,即:0 & 0=0;0 & 1=0;1 & 0=0;1 & 1=1。

例如:4 & 5按位与的结果为:

由此可知4 & 5=4。

如果参加 & 的数是负数(如-4 & -5),则以补码形式表示为二进制数,然后按位进行运算。

“按位与”运算通常用来对某些位清0或保留某些位。若想对一个存储单元清零,那么可以找一个数与原来的数中为1的位刚好相反的数,然后使二者进行 & 运算,即可达到清零目的。例如把a的高八位清0,保留低8位,可以a & 255运算(255的二进制数为0000000011111111)。

2.“按位或”运算符(|)

“按位或”是指参加运算的两个数中,两个相应的二进制位中只要有一个为1,该位的结果值为1,即0|0=0;0|1=1;1|0=1;1|1=1。

例如:11|5按位或的结果为:

由此可知11|5=15。

“按位或”运算常用来对一个数据的某些位定值为1。例如,如果想把a的低4位改为1,则只需要将a与15进行1运算即可。(www.chuimin.cn)

3.“按位异或”运算(^)

“按位异或”是指参加运算的两个数中,两个对应的二制位的数如果相异,该位的结果为1,否则该位的结果为0,即0^0=0;0^1=1;1^0=1;1^1=0。

例如:13^6按位异或的结果为:

按位异或主要用两个数的值交换,省去了定义新的变量,或者使特定的数翻转。

4.“取反”运算符(~)

“取反”(~)是单目(元)运算符,用于求整数的二进制反码,即分别将操作数各二进制位上的1变为0,0变为1。

例如:~15取反后结果为:

由此可知~15=24。

~取反运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他位运算符都高。例如:~a & b,先进行~a运算,然后进行 & 运算。

5.左移运算符(<<)

左移运算符用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0补齐,高位左移溢出则舍弃该高位。

例如:a=21,其对应的二进制数为00010101。若a=a<<2,则将a的二进制数左移2位。其结果为:01010100,即a=84。

左移1位相当于该数乘以2(21),左移2位相当于该数乘以4(22)。上面的例子21<<2=84,即将21乘以4。但是,此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。假设以1个字节(8位)存一个整数,若a为无符号整型变量,则a=64时,左移1位时溢出的是0,而左移2位时,溢出的高位中包含1,最终输出结果为0。

6.右移运算符(>>)

右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃。对于无符号数,高位补0;对于有符号数,高位补0还是补1取决于编译系统。高位移入0的称为“逻辑移位”,即简单移位;高位移入1的称为“算术移位”。例如:a的值是八进制数113755,则

a:1001011111101101

a>>1:0100101111110110(逻辑右移时)

a>>1:1100101111110110(算术右移时)

在有些系统中,a>>1得八进制数045766,而在另一些系统上可能得到的是八进制数145766。Turbo C和其他一些C编译采用的是算术右移,即对有符号数右移时,如果符号位原来为1,左面移入高位的是1。

例2.7 右移实例。