您好,欢迎访问三七文档
第十二章位运算12.1位运算符和位运算位运算是C语言中保留的汇编语言的功能用于自动化领域中的检测和自动控制方面所谓位运算是指对整型或字符型的数据进行二进制位的运算。12.1位运算符和位运算位运算符:&按位与|按位或^按位异或二目运算,左移有两个运算量右移~取反单目运算,仅有一个运算量参加运算的量,按对应的二进制位进行“与”运算。当对应的两个二进制都为1,结果值为1,否则为0即:0&0为00&1为01&0为01&1为112.1.1“按位与”运算符(&)如果运算量为负数,在内部是则以其二进制的补码形式表示的。例:3&53的二进制为000000115的二进制为000001013&5的结果为00000001利用按位与运算可以实现:(1)清零—将一个单元的某一位或全部位清零。使用一个对应二进制位不同的数,进行“&”运算。12.1.1“按位与”运算符(&)(2)取一个数中的指定位一个整数a占两个字节,如要取低字节的8位,则进行运算:a&(377)8其中8进制的377(10进制的255)的二进制为0000000011111111如要取高字节的8位,则进行运算:a&(0177400)8其中8进制的177400(10进制的65280)的二进制为111111110000000012.1.1“按位与”运算符(&)(3)保留指定位要保留的位取值为1,其余取0即可。a=8401010100b=5900111011c=a&b00010000=16有时将形如(377)8和(0177400)8这样的数称为“逻辑尺”。12.1.1“按位与”运算符(&)参加运算的量,按对应的二进制位进行“或”运算当对应的两个二进制有一个为1,结果值为1,否则为0即:0|0为00|1为11|0为11|1为1按位或运算常用来将某些位的值置为1例如:a|(377)8低8位为1,高8位不变12.1.2“按位或”运算符(|)异或运算符“^”也称XOR运算符当参与运算的两个二进制位值相同时,则为0,不相同时,则为1。即:0^0为00^1为11^0为11^1为0a=57(071)800111001b=42(052)800101010c=a^b(023)800010011=1912.1.3“异或”运算符(^)异或运算符“^”的应用:(1)使指定的二进制位取反根据异或运算的定义,当一位二进制位的值无论是0或1,再“^”一个1,均原值取反。例如:将一个数a的后四位取反:a=122(171)801111010b=15(017)800001111c=a^b(165)801110101=117(2)与0进行“^”运算,保留原值12.1.3“异或”运算符(^)(3)交换两个值,不用中间变量,方法为:a=a^b;b=b^a;a=a^b;例:设a=3,b=4a=011(^)b=100a=111(^)b=100b=011(^)a=111a=10012.1.3“异或”运算符(^)单目运算“~”用来对一个二进制数按位取反。例如:~(025)8=~(21)10~0000000000010101结果为1111111111101010(177752)8=(65514)1012.1.4“取反”运算符(~)例:一个整数a占2个字节,16位二进制,把最低位变成0,方法为:a&~10000000000111101(&)~0000000000000001=11111111111111100000000000111100“~”的运算优先级高于算术运算、关系运算、逻辑运算等运算符。12.1.4“取反”运算符(~)将一个二进制数向左移动指定的位数例如:a=a2将a的二进制数左移2位,左边移出的位舍弃,右边空出的位补012.1.5“左移”运算符()左移1位相当于该数乘以2,但当最高位为1时,左移时舍弃了一个2n-1,n为该数的二进制位数,整数类型为215。例如:1000000000000000(1)0000000000000000变成全012.1.5“左移”运算符()将一个二进制数向右移动指定的位数例如:a=a2将a的二进制数右移2位,右边移出的位舍弃。对于无符号数,右移时高位补012.1.6“右移”运算符()对于有符号数,有“逻辑右移”和“算术右移”两种。逻辑右移:高位补0算术右移:高位取原符号位的值,即:正数补0,负数补1例如:1001011111101101负数0100101111110110逻辑右移1100101111110110算术右移12.1.6“右移”运算符()位运算符与赋值运算符可以组成复合运算符。例如:&=|===^=其意义与算术运算符与赋值运算符组成的复合运算符相同。例如:a&=b相当于a=a&ba=2相当于a=a212.1.7位运算赋值运算符当两个不同长度的数据进行“&”、“|”、“^”运算时,自动按右端对齐。以long和int型为例:无符号数:多出的16位自动补0有符号数:多出的16位取符号位12.1.8不同长度的数据进行位运算例12.1取一个整数a的从右端开始的4~7位,右端第一位为0位。(1)先右移4位:a4(2)生成一个低4位为1的数:~(~04)(3)用这个数与a进行“&”运算:a4&~(~04)12.2位运算举例程序如下:main(){unsigneda,b,c,d;scanf(“%o”,&a);b=a4;c=~(~04);d=b&c;printf(“%o,%d\n%o,%d\n”,a,a,d,d);}例12.1取一个整数a的从右端开始的4~7位,右端第一位为0位。(1)先右移4位:a4(2)生成一个低4位为1的数:~(~04)(3)用这个数与a进行“&”运算:a4&~(~04)12.2位运算举例程序如下:main(){unsigneda,b,c,d;scanf(“%o”,&a);b=a4;c=~(~04);d=b&c;printf(“%o,%d\n%o,%d\n”,a,a,d,d);}例12.2循环移位。右循环移位:每向右移位一次,移出的位不舍弃,放到空出的最高位上。要求右移n位。(1)将a的右端n位放到b的高n位中:b=a(16-n)(2)将a右移n位,高n位补0:c=an(3)将c和b按位或运算:c=c|b12.2位运算举例程序如下:main(){unsigneda,b,c;intn;scanf(“a=%o,n=%d”,&a,&b);b=a(16-n);c=an;c=c|b;printf(“%o\n%d\n”,a,c);}(1)逻辑尺(2)位段12.3位段
本文标题:第十二章 位运算
链接地址:https://www.777doc.com/doc-3361936 .html