C语言位运算

C语言位运算
C语言位运算

C语言位运算

0或者1值的运算对象出发,计算出具有0或者1 值的结果。

C语言提供了6种基本位运算功能:位否定、位与、位或、位异或、位左移和位右移。其中除位否定是单目运算外,其余5种均为

双目运算,6个位运算符分为4个优先级别,参见表3-9。

表3-9 逻辑运算符

运算符含义运算对象个数结合方向优先级

~ 按位求反单目运算符自右向左1

<< 按位左移双目运算符自左向右2

>> 按位右移双目运算符自左向右2

& 按位与双目运算符自左向右3

| 按位或双目运算符自左向右4

^ 按位异或双目运算符自左向右5

说明:

①位运算的优先级是:~→<<、>>→&→|→^。

②位运算的运算对象只能是整型(int)或字符型(char)的数据。

③位运算是对运算量的每一个二进制位分别进行操作。

3.5.2 按位逻辑运算

按位逻辑运算包括:位与、位或、位异或和位否定等四种运算。为了帮助读者理解,我们设a和b都是16位二进制整数,

它们的值分别是:

a: 1010,1001,0101,0111

b: 0110,0000,1111,1011

为了便于阅读,a和b中每4位用一个逗号分开。以下介绍对于a和b的位与、位或、位异或和位否定等按位逻辑运算。

1.按位与运算(&)

按位与是对两个运算量相应的位进行逻辑与,"&"的运算规则与逻辑与"&&"相同。按位与表达式:c=a&b

a: 1010,1001,0101,0111

& b: 0110,0000,1111,1011

c: 0010,0000,0101,0011

2.按位或运算(|)

按位或是对两个运算量相应的位进行逻辑或操作,其运算规则与逻辑或"||"相同。按位或表达式:c=a|b

a: 1010,1001,0101,0111

| b: 0110,0000,1111,1011

c: 1110,1001,1111,1111

3.按位异或运算(^)

按位异或运算的规则是:两个运算量的相应位相同,则结果为0,相异则结果为1。

即:0^0=0 0^1=1 1^0=1 1^1=0

按位异或表达式:c=a^b

a: 1010,1001,0101,0111

^ b: 0110,0000,1111,1011

c: 1100,1001,1010,1100

可见,异或运算的含义是:两个相应位的值相异,则结果为1,相同则为0。

4.按位求反运算符(~)

按位求反运算运算规则是将二进制表示的运算对象按位取反,即将1变为0,将0变为1。

按位异或表达式:c=~a

~ a: 1010,1001,0101,0111

c: 0101,0110,1010,1000

5.按位逻辑运算的应用

例3-8:设int x=7,求y=~x

y=~x=~7=~(0000,0000,0000,0111)=1111,1111,1111,1000=-8

可见,对x的值(7)按位求反结果恰为-8的补码表示,其原因是计算机中有:

整数求负=整数求补=按位求反+1

所以:按位求反=整数求负-1。

请注意求反运算与单目减和逻辑非运算的区别:

y=-x; 结果为:y=-7,

y=!x; 结果为:y=0。

例3-9:用按位与运算屏蔽特定位(将指定位清为0)。

设n=051652(八进制数),计算m=n&0177,则:m=052。

n: 0,101,001,110,101,010

& 0177: 0,000,000,001,111,111

m: 0,000,000,000,101,010

经过位与运算,将n前9位屏蔽掉,即截取n的后7位。

例3-10:用按位与运算保留特定位。

要想将一个变量n的特定位保留下来,只要设一个数,使该数的某些位为1,这些位是与要保留的n的特定位相对应的

位,再将n与该数按位与。

设n=011050(为八进制数。对应的二进制为:0,001,001,000,101,000),要将n的右起第2、4、6、8、10位保留下

来,只要n=n&01252,则有:

n: 0,001,001,000,101,000

& 01252: 0,000,001,010,101,010

n: 0,000,001,000,101,000 (n=01050)

注意,按位与的"&"功能与取地址运算的"&"不同,尽管两者采用了相同的符号。例3-11:用按位或运算将指定的位置为1。

设:x=061,y=016,则z=a|b为:

x: 0000,0000,0011,0001

| y: 0000,0000,0000,1110

z: 0000,0000,0011,1111

即将x或y中为1的位的相应位置成1,其结果是z中的后6位为1。

例3-12:用按位异或运算将某个量的特定位翻转。

要将变量n的特定位翻转,即原来为1的变0,为0的变1,只要设一个数,使该数的某些位为1,这些位是与n中要翻转

的相对应的位,然后将n与该数进行按位异或运算。

设:a=015,要将后四位翻转,只要a=a^017,则:

a: 0000,0000,0011,1101

^ 017: 0000,0000,0011,1111

a: 0000,0000,0000,0010

3.5.3 移位运算

C语言提供了两个移位运算:左移和右移,它们是把整数作为二进制位序列,求出把这个序列左移若干位或者右移若干

位所得到的序列。左移和右移都是双目运算,运算符左边的运算对象是被左移或右移的数据,而运算符右边的运算对象是指明移

动的位数。数据左移或右移后空出来的位置补0。

左移、右移运算表达式的一般形式为:

x << n 或x >> n

其中x为移位运算对象,是要被移位的量;n是要移动的位数。

左移运算的规则是将x的二进制位全部向左移动n位,将左边移出的高位舍弃,右边空出的位补0。右移是将x的各二进制位全

部向右移动n位,将右边移出的低位舍弃,左边高位空出要根据原来量符号位的情况进行补充,对无符号数则补0;对有符号

数,若为正数则补0,若为负数则补1。

例如,设a=7,则:

b=a<<2 即:b=0000,0111<<2=0001,1100=28

c=a>>2 即:c=0000,0111>>2=0000,0001=1

左移的一个特殊用途是将整数值乘以2的幂,例如:左移运算表达式1<<4的计算结果是16,右移可以用于将整数值除乘2的

幂。

3.5.4 位运算赋值运算符

位运算符与赋值运算符可以组成以下5种位运算赋值运算符:

&=、|=、>>=、<<=、^=

由这些位运算赋值运算符可以构成位运算赋值表达式。例如:

x&=y 相当于:x=x&y

x<<=2 相当于:x=x<<2

x>>=3 相当于:x=x>>3

x^=5 相当于:x=x^5__

相关主题
相关文档
最新文档