1、8.1 位运算符位运算符8.2 位域位域8.3 位操作程序设计综合举例位操作程序设计综合举例8.1位运算符位运算符n6种位运算符种位运算符n位与位与&n位或位或|n位异或位异或 n位取反位取反 n 位左移位左移 n位运算的操作数为整型位运算的操作数为整型(char,short,int,long),运算结果是整型。,运算结果是整型。8.1位运算符位运算符8.1位运算符位运算符1.按位与按位与&参与运算的两个值,如果两个相应位都为参与运算的两个值,如果两个相应位都为1,则,则该位的结果为该位的结果为1,否则为,否则为0。即:即:0&0=0,0&1=0,1&0=0,1&1=1例如:例如:8.1位运算
2、符位运算符1.按位与按位与&n用来对操作数中的若干位置用来对操作数中的若干位置0,或者取操作数中,或者取操作数中的若干指定位。的若干指定位。例如:例如:char x;(1)将)将x的第的第4位和第位和第1位置位置0,11110110 x=x&0 xf6;掩码掩码0 xf6的的b3=0,b0=0 (2)取取x的低的低4位:位:x=x&0 x0f;掩码掩码0 x0f的的b7 b6 b5b4=0000 b3 b2 b1b0=1111 8.1位运算符位运算符2 按位或按位或|参与运算的两个值,只要两个相应位中有一参与运算的两个值,只要两个相应位中有一个为个为1,则该位的结果为,则该位的结果为1。即:即
3、:0|0=0,0|1=1,1|0=1,1|1=1例如:例如:8.1位运算符位运算符2.按位或按位或|n用来把操作数的某些特定位置用来把操作数的某些特定位置1.例如:将例如:将int 型的变量型的变量a的的b3、b4位置位置1:a=a|0 x18 掩码:掩码:00011000 8.1位运算符位运算符3.按位异或按位异或 参与运算的两个值,如果两个相应位不同,则参与运算的两个值,如果两个相应位不同,则结果为结果为1,否则为,否则为0。即:即:00=0,10=1,01=1,11=0例如:例如:8.1位运算符位运算符3.按位异或按位异或 n使某些特定的位翻转。使某些特定的位翻转。n如果是某位与如果是某
4、位与0异或,结果是该位的原值;异或,结果是该位的原值;n如果是某位与如果是某位与1异或,则结果与该位原来的异或,则结果与该位原来的值相反。值相反。例如:要使例如:要使11010110的的b4、b5翻转翻转 将数与将数与00011000进行按位异或运算。进行按位异或运算。11010110 00011000 110011108.1位运算符位运算符4 按位取反按位取反 一元运算法,对数据的每个二进制位取反一元运算法,对数据的每个二进制位取反.即把即把1变为变为0,把,把0变为变为1例如:例如:8.1位运算符位运算符5移位移位(1)左移运算()左移运算()将一个数的各二进制位全部右移若干位。将一个数的
5、各二进制位全部右移若干位。右移后,低位舍弃右移后,低位舍弃;高位:若是无符号数高位:若是无符号数,补补0;若是有符号数,补若是有符号数,补“符号位符号位”。n一个无符号数,右移一位相当于除一个无符号数,右移一位相当于除2取商取商.8.1位运算符位运算符5移位移位 某一变量所包含的各二进位按指定的方某一变量所包含的各二进位按指定的方向移动指定的位向移动指定的位.例例8-1 位运算的应用位运算的应用void main()unsigned int w1=0 x155,w2=0 x1c7,w3=0 x52;int w4=-128,w5=128;printf(%x%x%x n,w1&w2,w1|w2,w
6、1w2);printf(%x%x%x n,w1,w2,w3);printf(%x%x%x n,w1w2,w1&w2,w1|w2|w3);printf(%x%x n,w1|w2&w3,w1&w2|w3);printf(%x%x n,(w1&w2),w1|w2);printf(%d%d n,w41,w51);8.2位域位域 BitFieldn有些信息在存储时,并不需要占用一个完整的有些信息在存储时,并不需要占用一个完整的存储单元,存储单元,而只需一个或几个二进制位。而只需一个或几个二进制位。例如例如,存放一个开关量时,只有存放一个开关量时,只有0和和1 两种状态,两种状态,只要用一个二进位即可。只
7、要用一个二进位即可。n位域位域:把一个存储单元中的二进制划分为几个把一个存储单元中的二进制划分为几个不同的区域,并说明每个区域的位数。不同的区域,并说明每个区域的位数。n每一个域有一个域名,允许在程序中按域名进行操每一个域有一个域名,允许在程序中按域名进行操作。作。8.2位域位域n位域的声明形式:位域的声明形式:struct 结构体名结构体名 类型类型1 成员成员1:长度长度;类型类型2 成员成员2:长度长度;类型类型n成员成员3:长度长度;位域变量位域变量;8.2位域位域例如:例如:struct BitSeg1 unsigned char a:4;unsigned char b:3;unsi
8、gned char c:1;flags;声明位域变量声明位域变量flags由三个成员由三个成员a、b、c组成,组成,a占有占有4bits,b占有占有3bits,c占有占有1bits,整个变,整个变量量flags分配的存储单元大小为分配的存储单元大小为char类型的存储类型的存储单元,大小为单元,大小为1Byte。8.2位域位域例如:例如:struct BitSeg2 unsigned char f1:1;unsigned char f2:1;unsigned char f3:1;unsigned char f4:3;unsigned char f5:7;/从第二个从第二个char型的存储单元分
9、配成员型的存储单元分配成员f5;声明的结构类型声明的结构类型struct BitSeg2占用的空间大占用的空间大小为小为2Bytes。其中成员。其中成员f1、f2、f3、f4占用占用第一字节,第一字节,f5占用第二字节。占用第二字节。例例8-2 位域的应用。位域的应用。typedef struct unsigned char f1:1;unsigned char f2:1;unsigned char f3:1;unsigned char type:4;unsigned char index:8;Flags;void main()Flags flags;flags.f1=1;flags.f2=0
10、;flags.f3=1;flags.type=0 x7;flags.index=0 x81;printf(%x%x%x%1x%2xn,flags.f1,flags.f2,flags.f3,flags.type,flags.index);printf(The size of variable flags is%dn,sizeof(flags);1 0 1 7 81The size of variable flags is 28.3位操作程序设计综合举例位操作程序设计综合举例 例例8-3 将一个无符号八位二进制数的低将一个无符号八位二进制数的低4位与高位与高4位进行交换,并以十六进制格式位进行交换
11、,并以十六进制格式输出原数和交换后的结果。输出原数和交换后的结果。#include void main()unsigned char flag1=0 x8f;unsigned char flag2,flag3,flag4;flag2=flag1&0 x0f;/屏蔽高屏蔽高4位后位后,将低将低4位送给位送给flag2flag2=flag2=4;/将高将高4位移到低位移到低4位位flag4=flag2|flag3;printf(%x n,flag1);printf(%x n,flag4);8ff8例例8-4 编写一个带参数的宏编写一个带参数的宏clearBit(x,n),用于,用于将将x的第的第n位置位置0,假设,假设n=0。#include /(0 x1n)是第是第n位是位是1,其他位是,其他位是0#define clearBit(y,n)y&=(0 x1n)void main()unsigned x=0 xfe78feaf;unsigned y=0 xfeaf;clearBit(x,31);clearBit(y,1);printf(x=%x,y=%xn,x,y);x=7e78feaf,y=fead本章小结本章小结