资源描述:
《第9章 位运算》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第9章位运算第9章位运算本章要点:六种位运算的基本概念、主要应用位运算的混合使用2第9章位运算9.1位运算的类型9.2位运算举例9.3位段9.4总结与提高39.1位运算的类型C语言一共提供了六种位运算符:&:按位“与”
2、:按位“或”∧:按位“异或”~:取反<<:左移>>:右移这六种运算符号的优先级别(由高到低):‘~’—>‘<<’和‘>>’—>‘&’—>‘∧’—>‘
3、’。这六种运算符号的结合性为:‘~’为自右至左,其它为自左至右。49.1位运算的类型要特别注意的是,参与运算的数是以补码方式出现的,并且参与运算的量应为整型或字符型
4、,不能为实型数据。59.1位运算的类型—按位“与”运算按位“与”运算符“&”是双目运算符,其功能是对参与运算的两数从低位到高位对应的位相与,“与”操作规定为:1&1的结果为1,0&1、1&0、0&0的结果都为0。69.1位运算的类型—按位“与”运算例9-1两个整数的“与”操作。main(){inta=5,b=6;intc=-5,d=-6;intx,y;x=a&b;y=c&d;printf("\n%d,%d",x,y);}该程序运行的结果为:4,-679.1位运算的类型—按位“与”运算说明:5的二进制数是00000101,6的二进
5、制数是00000110,那么a&b的结果为4,如下式所示。00000101(5)(&)00000110(6)00000100(4)而-5的二进制数补码是11111011,-6的二进制数补码是11111010,因此c&d的结果为-6,如下式所示。11111011(-5)(&)11111010(-6)11111010(-6)89.1位运算的类型—按位“与”运算按位“与”运算常用于位清零。欲将一个变量的某些位清零,只要同另一个相应位为0其余位为1的数进行“与”运算即可。同理,要提取某个数的一些位,只要将其同另一个相应位为1而其余位为0
6、的数进行“与”运算即可。99.1位运算的类型—按位“或”按位“或”运算符“
7、”是双目运算符,其功能是参与运算的两数从低位到高位对应的位相或,“或”操作规定为:0
8、0的结果为0,1
9、1、1
10、0及0
11、1的结果都为1。109.1位运算的类型—按位“或”按位“或”运算常用来对数据的某些位置1。假设int型变量a的值为20000,它对应的16位二进制数是0100111000100000,表达式a
12、255的结果是变量a对应数值的低8位全置为1,高8位保留原样。如下式所示。0100111000100000(20000)(
13、)000000001
14、1111111(255)0100111011111111(20223)从上例中可以看出,如果要使某个数的一些位变成1,可以让这些位按位与1进行“或”运算,其它位则分别与0相“或”,保持不变。119.1位运算的类型—按位“异或”按位“异或”运算符“∧”是双目运算符,其功能是参与运算的两数从低位到高位对应位相“异或”,“异或”运算规定:1∧0和0∧1的结果为1,1∧1和0∧0的结果为0。八进制数22与八进制数13按位进行“异或”的算式如下所示。00010010(022)∧00001011(013)00011001(031)与1进行“
15、异或”运算的位将得到与该位相反的值,即1∧01,1∧10。与0进行“异或”运算的位则保持不变,即0∧00,0∧11。因此,“异或”运算可以方便地将数据的某些位翻转,而其它位不变。129.1位运算的类型—取反取反运算符“~”是单目运算符,其功能是对参与运算的数的各二进制位按位求反。例如:~00000000101100101111111101001101139.1位运算的类型—左移左移运算符“<<”是双目运算符,它的功能是把“<<”左边的运算数的各二进位整体左移若干位,“<<”右边的数则指定移动的位数,左移过程中丢弃移出存储
16、单元的高位数据,低位补0。例如:表达式a<<4的结果是a中数据的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。可见在高位没有溢出1的情况下,左移n位相当于该数乘以n个2。但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。左移比乘法运算快得多,有些C编译程序自动将乘2的运算用左移一位来实现,将乘以n个2的幂运算处理为左移n位。149.1位运算的类型—右移右移运算符“>>”是双目运算符。其功能是把“>>”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的
17、位数。例如:设a=15,a>>2表示把00001111右移为00000011(十进制3)。应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,高位补0;而为负数时,高位是补0或是补1取决于编译系统的规定。TurboC和很多系统规定为补1。与左移运