第15章位运算位运算琴岛学院计算机工程系琴岛学院计算机工程系回顾数值的表示原码反码补码数值在计算机中存储或运算时用补码位运算---位运算对象只能是整型或字符型数据运算符:~、<<、>>、&、^、|~&^|<<>>位逻辑运算符位逻辑运算符移位运算符移位运算符单目单目位运算符的运算对象只能是位运算符的运算对象只能是整型数据整型数据或或字字符型数据符型数据,不能是实型数据,不能是实型数据运算对象一律按二进制补码参加运算,并运算对象一律按二进制补码参加运算,并按位进行运算按位进行运算位运算的结果是一个整型数据位运算的结果是一个整型数据低于单目、算术运算符,高于其他运算符低于单目、算术和关系运算符,高于其他运算符(1)格式:~x~x(2)规则:各位翻转,即原来为1的位变成0,原来为0的位变成1。~01001101——————————结果结果:101100101、按位取反——~注:本书中均以short或char型数据为例2.按位左移──<<(1)格式:x<00010100(3)说明:左移n位,相当于该数乘以2的n次幂,可以代替乘法加快运算速度。但此结论只适用于该数左移时舍弃的高位中不包含1的情况.例如:a=65;b=a<<2;b的值是多少?a:01000001b:00000100b=43.按位右移──>>(1)格式:x>>x>>位数位数(2)规则:使操作数的各位右移,移出的低位舍弃低位舍弃;高位高位::(1)(1)对无符号数和正整数补0;(2)对负整数补1。说明:参与运算时,操作数x和y,都必须首先转换成二进制形式,然后再执行相应的按位运算。例如:shortintb=-10,a;a=b>>4a=?b在计算机中的二进制形式:1111111111110110右移4位后→1111111111111111移位运算举例a+8>>b-1等价于(a+8)>>(b-1)例如:例如:假设假设a=10a=10,,b=2b=2,求,求a<>a+8>>b-1b-1main(){inta=10,b=2;printf("%d%d\n",a<>b-1a+8>>b-1);}输出结果:409409请自行分析请自行分析运行结果运行结果4.按位与——&1.格式:x&y2.规则:任何位和1与不变,和0与清零例如3&9=1:0011&1001────00013.主要用途:取(或保留)1个数的某(些)位,其余各位置0。5.按位异或——^(1)格式:x^yx^y如:3^9=10。(2)规则:对应位相同时为0,不同时为1:和和11异或翻转,和异或翻转,和00异或不翻转异或不翻转(3)主要用途:使1个数的某(些)位翻转(即原来为1的位变为0,为0的变为1),其余各位不变。6.按位或——|(1)格式:x|yx|y(2)规则:对应位均为0时为0,否则为1:任何位和任何位和11或置或置11,和,和00或不变或不变例如,3|9=110011|1001────1011=11(3)主要用途:将1个数的某(些)位置1,其余各位不变。程序举例:main(){shorta=10,b=010;printf("%d%d\n",a&b,a|b);printf("%d%d\n",a^b,~a);}输出结果:8108102-112-1100000000000010100000000000001010&0000000000001000&000000000000100000000000000010000000000000001000即:即:a&ba&b的值是的值是8800000000000010100000000000001010˜˜11111111111101011111111111110101即:即:˜a˜a的值是的值是--1111||0000000000001000000000000000100000000000000010100000000000001010a|b的值是1000000000000010100000000000001010^0000000000001000^000000000000100000000000000000100000000000000010即:即:a^ba^b的值是的值是22