24/12/251CC语言程序设计语言程序设计第第1212章位运算章位运算北京航空航天大学北京航空航天大学交通科学与工程学院交通科学与工程学院徐国艳徐国艳24/12/252本章内容本章内容§12.1§12.1位及位运算的概念位及位运算的概念§12.2§12.2位运算符位运算符§12.3§12.3位运算举例位运算举例24/12/253位运算:二进制位的运算。位运算:二进制位的运算。在内存中每一个字节有一个地址。在内存中每一个字节有一个地址。一个字节由一个字节由88位二进制位组成。位二进制位组成。位操作是直接对二进制位进行的,位运算只适用于位操作是直接对二进制位进行的,位运算只适用于无符号整型变量无符号整型变量。。0111110101111101最低位最低位最高位最高位§12.1§12.1位及位运算的概念位及位运算的概念24/12/254§12.2§12.2位运算符位运算符CC语言提供如下位运算符。其中除运算符语言提供如下位运算符。其中除运算符~~以以外。都是二目运算符。外。都是二目运算符。运算符运算符语义语义&&按位与按位与||按位或按位或∧∧按位异或按位异或~~按位取反按位取反<<<<左移左移>>>>右移右移24/12/255参加运算的两个运算量,如果对应二进制位都是参加运算的两个运算量,如果对应二进制位都是11,则该位的结果为,则该位的结果为11,否则该位是,否则该位是00。。例例::用按位与操作实现宏用按位与操作实现宏is_oddis_odd,,判断某个整判断某个整数是否为奇数数是否为奇数::##defineis_odd(x)(1&(unsigned)(x))defineis_odd(x)(1&(unsigned)(x))也可以用按位与运算也可以用按位与运算屏蔽屏蔽掉某些二进制位,如掉某些二进制位,如::c=n&0177c=n&01771.1.按位“与”运算符按位“与”运算符&&24/12/256参与运算的两个运算量,如果对应二进制位都参与运算的两个运算量,如果对应二进制位都是是00,则该位的结果值为,则该位的结果值为00,否则该位的结果值是,否则该位的结果值是11。。按位或运算用来对一个数据的某些二进制位置按位或运算用来对一个数据的某些二进制位置11。。例如例如::x|MASKx|MASK的运算结果是将的运算结果是将xx中相应于中相应于MASKMASK为为11的那些位置的那些位置11。。2.2.按位“或”运算符按位“或”运算符24/12/257按位异或运算是使参与运算的两个按位异或运算是使参与运算的两个量,如果对应二进制位不同,则该位结量,如果对应二进制位不同,则该位结果是果是11,否则该位的结果是,否则该位的结果是00。。按位异或操作可以用来检查两个字按位异或操作可以用来检查两个字是否相同。是否相同。例如例如::if(x∧y)if(x∧y)……/*x/*x和和yy不同不同*/*/3.3.按位“异或”运算符按位“异或”运算符∧∧24/12/258~~是单目运算符,用来对一个二进制数按位取是单目运算符,用来对一个二进制数按位取反,即将反,即将00变为变为11,将,将11变成变成00。。这个操作可用于某些依赖于具体计算机字长的这个操作可用于某些依赖于具体计算机字长的应用中,从而使结果代码是可移植的。应用中,从而使结果代码是可移植的。例如例如::用来将字用来将字xx的低的低33位清零位清零::x=x&0xfff8;x=x&0xfff8;但这个操作只能应用于但这个操作只能应用于1616位字长的计算机。如位字长的计算机。如果计算机的字长为果计算机的字长为3232位,结果将会有所不同。位,结果将会有所不同。一个可移植的方法是一个可移植的方法是::x=x|~0x7;x=x|~0x7;这种表达方式与机器字长无关,也无需额外开这种表达方式与机器字长无关,也无需额外开销,因为~销,因为~00x7x7是个常量表达式,所以是在编是个常量表达式,所以是在编译时求值的。译时求值的。44按位“取反”运算符按位“取反”运算符~~24/12/259x<>n:x>>n:把把xx的每一个二进制位右的每一个二进制位右移移nn...