第12章 位运算.ppt
第12章 位运算,§12.1 位运算符和位运算,C语言提供6种位运算符,说明:(1)""为单目运算符,其余均为双目运算符,优先级高低顺序: 按位求反 移位 按位与& 按位异或 按位或|(2)运算量只能是整型或字符型数据,不能是实型(3)参与运算时,操作数都必须转换成二进制形式,然后再执行按位运算,12.1.1“按位与”运算符(&),格式:x&y 规则:对应位均为1时才为1,否则为0(全1为1) 0&0=0,0&1=0,1&0=0,1&1=1,求:3&9 3&-9比较3&9和3&&9的值,主要用途:(1)取(或保留)1个数的某(些)位,其余各位置0。 实现方法:和一个数按位与,该数中舍弃位取0,保留位取1 例:保留00101100的低4位(2)清零 实现方法:和一个数按位与,该数的每一位与原数相反 例:把00101011清零,任何一个二进制位和0按位与结果为0,和1按位与结果不变,12.1.2 “按位或”运算符(|),格式:x|y 规则:对应位均为0时才为0,否则为1(一1为1) 0|0=0,0|1=1,1|0=1,1|1=1,求:3|9 3|-9,主要用途: 将1个数的某(些)位置1,其余各位不变。 实现方法:和一个相应位为1的数按位或 例:把00001010的第7位置为1 00001010|01000000 01001010,任何一个二进制位和0按位或结果不变,和1按位或结果为1,12.1.3 “按位异或”运算符(),格式:xy 规则:对应位相同时为0,不同时为1 00=0,01=1,10=1,11=0,求:39 3-9,主要用途:(1)使1个数的某(些)位翻转(原来为1的位变为0,为0的变为1),其余各位不变。 实现方法:和一个相应位为1其余位为0的数按位异或 例:把00001010的第7和第4位翻转 0000101001001000 01000010(2)交换两个变量的值: a=3,b=4则a=ab;b=ba;a=ab;,任何一个二进制位和0按位异或保持原值,和1按位异或原值取反,12.1.4 “按位取反”运算符(),格式:x 规则:各位翻转,即原来为1的位变成0,原来为0的位变成1 0=1,1=0,主要用途: 间接地构造一个数,以增强程序的可移植性。 例:0间接地构造一个全1的数,12.1.5 “按位左移”运算符(<<),格式:x<<位数 规则:使操作数的各位左移,低位补0,高位溢出 例:5<<2=,20,如果左移出的位不是1,则左移操作相当于乘法操作,左移一位相当于原数乘以2,左移n位,则相当于原数乘以2n,12.1.6 “按位右移”运算符(>>),格式:x>>位数 规则:使操作数的各位右移,移出的低位舍弃,高位遵循如下规则: 1)对无符号数和有符号中的正数,补0; 2)有符号数中的负数,取决于所使用的系统:补0的称为“逻辑右移”,补1的称为“算术右移”(TC系统)。 例:20 >>2=,5,左移操作相当于除法操作,右移一位相当于原数除以2,右移n位,则相当于原数除以2n,(1)实现&、|、运算主要用途的方法 第一步:构造1个整数:该数在要取(保留)的位、或要置1的位、或要翻转的位上为1,其余均为0。 第二步:进行按位与、或按位或、或按位异或操作。,(2)实现构造一个数的方法 第一步:求0,间接地构造一个全1的数; 第二步:按需要进行左移或右移操作,构造出所需要的数。 例:构造一个低4位为1,其余全为0的数(3)除按位取反运算外,其余5个位运算符均可与赋值运算符一起,构成复合赋值运算符: &=、|=、=、>= (4)不同长度数据间的位运算低字节对齐,短数的高字节按最高位补位: 对无符号数和有符号中的正数,补0; 有符号数中的负数,补1。,对位运算符的几点说明,long x:00000000 00000000 00000000 00001000int y: & 00000000 00000110,