1第十二章位运算※位运算符与位运算学习本章基础:2、8、10、16进制数的相互转换※位段及其应用151413121110987654321012.1位运算符与位运算二进制数的位的编号一、位运算符位运算符的运算对象是整数(包括带符号整型、无符号整型、字符型)运算规则是对其中每个二进制位上的0、1进行的;运算结果是整数。【注】长度不等的整数进行“位运算”,执行“就长不就短”的转换规则!转换对象若是无符号整数,则在左边加0;若是带符号整数,则在左边加符号位。【例】shorta=-1,b=1;unsignedshortc=65535;扩展部分原数据若转换成long型:a=1111111111111111b=0000000000000000c=000000000000000011111111111111110000000000000001111111111111111121.位逻辑运算符【注】(1)位运算符的运算规则。(2)位逻辑运算符的优先级如下:●~》算术》关系》&》^》|》&&》||。●~、!、++、--、单目+、-、sizeof()是同级的,结合性自右向左。【例】chara='A';shortb=0x5050,c=0xA0A0;a=01000001a=0000000001000001b=0101000001010000~a=10111110b=0101000001010000c=1010000010100000a&b=0000000001000000b&c=0000000000000000a|b=0101000001010001b|c=1111000011110000a^b=0101000000010001b^c=1111000011110000名称对象数与位置运算符对象类型运算规则结果类型结合性位非单目前缀~整型字符型~1为0~0为1整型自右向左位与双目中缀&参看注(1)自左向右按位加^位或|aba&ba|ba^b0000001011100111111032.位移位运算符优先级:算术运算符》位移位运算符》关系运算符【注】移位运算与对象是否带符号有关,具体规则如下:无符号数左移(×2n)带符号数左移┌─┬─┬...┬─┬─┐┌─┬─┬...┬─┬─┐丢弃←│←│←│←│←│←│←0丢弃←│←│←│←│←│←│←0└─┴─┴...┴─┴─┘└─┴─┴...┴─┴─┘无符号数右移(÷2n)带符号数右移┌─┬─┬...┬─┬─┐┌─┬─┬...┬─┬─┐0→│→│→│→│→│→│→丢弃┌→│→│→│→│→│→│→丢弃└─┴─┴...┴─┴─┘│└┬┴─┴...┴─┴─┘└──┘【例】unsignedshorta=12;a=0000000000001100黑框:原数shortb=-1;b=1111111111111111红框:结果a<<3:000结果是0000000001100000(12×23=96)a>>3000结果是0000000000000001(12÷23=1)b<<3:000结果是1111111111111000(-1×23=-8)b>>3111结果是1111111111111111(-1)名称对象数与位置运算符对象类型运算规则结果类型结合性位左移双目中缀<<整型字符型X<>X>>YX右移Y位0000000000001100000000000000110011111111111111111111111111111111有时正确43.位复合赋值运算符(在3.9节已经见过)优先级:条件运算符》赋值、复合赋值运算符》逗号运算符所有赋值、复合赋值运算符优先级均相同,结合性自右向左的【例】设有shorta=0xAA55;a&=0xBBBBa|=0xBBBBa^=0xBBBB相当于a=a&0xBBBBa=a|0xBBBBa=a^0xBBBBa=1010101001010101a=1010101001010101a=10101010010101010xBBBB=101110111011101110111011101110111011101110111011结果a=1010101000010001a=1011101111111111a=0001000111101110a<<=4a>>=4相当于a=a<<4a=a>>4a=1010101001010101a=1010101001010101结果a=1010010101010000结果a=1111101010100101名称对象数与位置运算符对象类型运算规则结果类型结合性位与赋值双目中缀&=左边:变量右边:表达式整型、字符型X&=Y相当于X=X&(Y)整型或字符型自右向左X|=Y相当于X=X|(Y)位或赋值|=位按位加赋值^=X^=Y相当于X=X^(Y)位左移赋值<<=X<<=Y相当于X=X<<(Y)位右移赋值>>=X>>=Y相当于X=X>>(Y)512.2位运算程序设计例【例1】取出带符号短整型数据的4~7位,组成新的短整型数据。程序:#include"stdio.h"算法:a=xxxxxxxxyyyyxxxxvoidmain()运算数:0000000011110000{shorta,b;&结果00000000yyyy0000scanf("%x",&a);右移4位000000000000yyyyb=a&0x00F0;b>>=4;printf("%x\n",b);}【例2】无符号短整型数据循环右移4位。(例如电子屏幕图案变化)程序:#include"stdio.h"算法:a=xxxxyyyyzzzzmmmmvoidmain()a左移12位b=mmmm000000000000{unsignedshorta,b,c,d;a右移4位c=0000xxxxyyyyzzz...