第第99章位运算章位运算9.19.1位及位运算的概念位及位运算的概念位运算位运算:二进制位的运算。:二进制位的运算。在内存中每一个字节有一个地址。在内存中每一个字节有一个地址。一个字节由一个字节由88位二进制位组成。位二进制位组成。位操作是直接对二进制位进行的,位运算只适用于位操作是直接对二进制位进行的,位运算只适用于无符号整型变量无符号整型变量。。0111110101111101最低位最高位9.29.2位运算符位运算符CC语言提供如下位运算符。其中除运算符语言提供如下位运算符。其中除运算符~~以外。都是二目运算符。以外。都是二目运算符。运算符运算符语义语义&&按位与按位与||按位或按位或∧∧按位异或按位异或~~按位取反按位取反<<<<左移左移>>>>右移右移1.1.按位按位““与与””运算符运算符&&参加运算的两个运算量,如果对应二进制位参加运算的两个运算量,如果对应二进制位都是都是11,则该位的结果为,则该位的结果为11,否则该位是,否则该位是00。。例例::用按位与操作实现宏用按位与操作实现宏is_oddis_odd,它判断某个,它判断某个整数是否为奇数整数是否为奇数::#defineis_odd(x)(#defineis_odd(x)(11&&(unsigned)(x))(unsigned)(x))也可以用按位与运算也可以用按位与运算屏蔽屏蔽掉某些二进制位,掉某些二进制位,如如::c=nc=n&&017701779.29.2位运算符位运算符2.2.按位按位““或或””运算符运算符||参与运算的两个运算量,如果对应二进制位都参与运算的两个运算量,如果对应二进制位都是是00,则该位的结果值为,则该位的结果值为00,否则该位的结果值是,否则该位的结果值是11。。按位或运算用来对一个数据的某些二进制位置按位或运算用来对一个数据的某些二进制位置11。。例如例如::xx||MASKMASK的运算结果是将的运算结果是将xx中相应中相应于于MASKMASK为为11的那些位置的那些位置11。。9.29.2位运算符位运算符3.3.按位按位““异或异或””运算符运算符∧∧按位异或运算是使参与运算的两个量,如果对按位异或运算是使参与运算的两个量,如果对应二进制位不同,则该位结果是应二进制位不同,则该位结果是11,否则该位,否则该位的结果是的结果是00。。按位异或操作可以用来检查两个字是否相同。按位异或操作可以用来检查两个字是否相同。例如例如::if(x∧y)if(x∧y)……/*x/*x和和yy不同不同*/*/9.29.2位运算符位运算符4.4.按位“按位“取反取反”运算符”运算符~~~~是单目运算符,用来对一个二进制数是单目运算符,用来对一个二进制数按位取反按位取反,即,即将将00变为变为11,将,将11变成变成00。。这个操作可用于某些依赖于具体计算机字长的应用中,这个操作可用于某些依赖于具体计算机字长的应用中,从而使结果代码是可移植的。从而使结果代码是可移植的。例如例如::用来将字用来将字xx的低的低33位清零位清零::x=xx=x&&0xfff80xfff8;;但这个操作只能应用于但这个操作只能应用于1616位字长的计算机。如果计位字长的计算机。如果计算机的字长为算机的字长为3232位,结果将会有所不同。位,结果将会有所不同。一个可移植的方法是一个可移植的方法是::x=xx=x||~0x7~0x7;;这种表达方式与机器字长无关,也无需额外开销,这种表达方式与机器字长无关,也无需额外开销,因为因为~0x7~0x7是个常量表达式,所以是在是个常量表达式,所以是在编译编译时求值的。时求值的。9.29.2位运算符位运算符5.5.左移左移运算符运算符<<<>>>xx>>>>nn::把把xx的每一个二进制位右移的每一个二进制位右移nn位,丢掉最位,丢掉最右边的右边的nn位,最左边的位,最左边的nn位补位补00。。右移一位相当于将该数除以右移一位相当于将该数除以22。。对于负整数,高位补对于负整数,高位补11。。9.29.2位运算符位运算符7.7.位运算符与赋值运算符结合可以组成复位运算符与赋值运算符结合可以组成复合的赋值运算...