1、C语言程序设计本章重点: 位运算符和位运算 位段的概念第12章 位运算12.1 位运算符和位运算位运算:以二进制位为单位的运算。位运算仅限于整数(整型数和字符型)一、与位运算符(&)1. 运算规则运算的两个二进制位值都为1,结果才为12. 举例3&5=118&35=?23&1=?二、或位运算符(|)1. 运算规则运算的两个二进制位值有一个为1,结果就为12. 举例3|5=?18|35=?两个数组或运算的意义延伸三、异或位运算符()1. 运算规则运算的两个二进制位值不同,结果为1,否则结果为02. 举例A=3A=A5=? A=A5=?两个数组异或运算的意义延伸四、取反位运算符()1. 运算规则若
2、运算的位值为1,结果为0,值为0,则结果为1。2. 举例3=?取反位运算符的运算优先级高于其它位运算符取反在图形学上的含义五、左移位运算符()1. 运算规则整体左移,右补0,左移出的高位丢弃左移1位,相当于乘2(高位未移出时)左移n位,相当于乘2的n方(高位未移出时)2. 举例11; 121)1. 运算规则整体右移,左补0/1,右移出的低位丢弃右移1位,相当于除2(低位未移出时)右移n位,相当于除2的n方(低位未移出时)2. 举例121 122655七、赋值位运算符1. 运算符&=, |=, =, =, =2. 举例a&=3八、位运算举例例 输入一个正整数,然后输出它对应的二进制数。/*方法一
3、*/main()int x, t, i;clrscr();printf(please input x:);scanf(%d, &x);for (i=0; i16; i+ )t=x%2;gotoxy(16-i,3);printf(%d,t);x=x/2;getch();/*方法二*/#include conio.hmain()int x, i, t;clrscr();printf(please input x:);scanf(%d, &x);for (i=0; ii; /除2t=t&1; /取余gotoxy(16-i,4);printf(%d,t);/* t=x(15-i);t=t&1;prin
4、tf(%d,t);*/getch();/*方法三*/#include conio.h#include math.hmain()int x, i, t, n;clrscr();printf(please input x:);scanf(%d, &x);for (i=0; ii;gotoxy(16-i,4);printf(%d,t);/* n=pow(2,15-I);t=x&n;t=t(15-I);printf(“%d”,t);*/getch();12.2 位段位段:在一个结构体中可以以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为位段(或位域)。 一、位段的定义如:struct pa
5、cked_data unsigned a : 2;unsigned b : 3;unsigned c : 4;int i;存储单元分配:共4个字节 716432a b c i data; 二、位段的引用1. 引用形式data.a=2;data.b=7;data.c=9; 位段允许的最大值范围,data.a=4是错的2. 说明 位段成员的类型必须指定为unsigned int类型。 允许在位段中定义无名字段,其含义为跳过该字节剩余的位或指定的位不用。当无名字长度为0时,跳过该字节剩余的位不用;当无名字段长度为n时,跳过n位不用。 位段的长度不能大于存储单元的长度。即16位 不能定义位段数组。 位段可以在数值表达式中引用,也可以用整型格式输出。 如:struct packed_data unsigned a : 2;unsigned b : 3;unsigned : 0;unsigned c : 4;int i; data; abci233448又如:struct packed_data unsigned a : 2;unsigned b : 3unsigned : 2;unsigned c : 4;int i; data; abci232458第12章 第5页