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=A^5=?A=A^5=?两个数组异或运算的意义延伸四、取反位运算符(~)1.运算规则若运算的位值为1,结果为0,值为0,则结果为1。第12章第1页C语言程序设计2.举例~3=?取反位运算符的运算优先级高于其它位运算符取反在图形学上的含义五、左移位运算符(<<)1.运算规则整体左移,右补0,左移出的高位丢弃左移1位,相当于乘2(高位未移出时)左移n位,相当于乘2的n方(高位未移出时)2.举例1<<1;1<<21<<15六、右移位运算符(>>)1.运算规则整体右移,左补0/1,右移出的低位丢弃右移1位,相当于除2(低位未移出时)右移n位,相当于除2的n方(低位未移出时)2.举例12>>112>>265>>5七、赋值位运算符1.运算符&=,|=,^=,>>=,<<=2.举例a&=3八、位运算举例[例]输入一个正整数,然后输出它对应的二进制数。/*方法一*/main(){第12章第2页C语言程序设计intx,t,i;clrscr();printf("pleaseinputx:");scanf("%d",&x);for(i=0;i<16;i++){t=x%2;gotoxy(16-i,3);printf("%d",t);x=x/2;}getch();}/*方法二*/#include"conio.h"main(){intx,i,t;clrscr();printf("pleaseinputx:");scanf("%d",&x);for(i=0;i<16;i++){t=x>>i;//除2t=t&1;//取余gotoxy(16-i,4);printf("%d",t);第12章第3页C语言程序设计/*t=x>>(15-i);t=t&1;printf("%d",t);*/}getch();}/*方法三*/#include"conio.h"#include"math.h"main(){intx,i,t,n;clrscr();printf("pleaseinputx:");scanf("%d",&x);for(i=0;i<16;i++){n=pow(2,i);t=x&n;t=t>>i;gotoxy(16-i,4);printf("%d",t);/*n=pow(2,15-I);t=x&n;t=t>>(15-I);printf(“%d”,t);*/}getch();}第12章第4页C语言程序设计§12.2位段位段:在一个结构体中可以以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为位段(或位域)。一、位段的定义如:structpacked_data{unsigneda:2;unsignedb:3;unsignedc:4;inti;}data;二、位段的引用1.引用形式data.a=2;data.b=7;data.c=9;位段允许的最大值范围,data.a=4是错的2.说明⑴位段成员的类型必须指定为unsignedint类型。⑵允许在位段中定义无名字段,其含义为跳过该字节剩余的位或指定的位不用。当无名字长度为0时,跳过该字节剩余的位不用;当无名字段长度为n时,跳过n位不用。⑶位段的长度不能大于存储单元的长度。即≤16位⑷不能定义位段数组。⑸位段可以在数值表达式中引用,也可以用整型格式输出。如:structpacked_data{unsigneda:2;unsignedb:3;第12章第5页存储单元分配:共4个字节716432abciC语言程序设计unsigned:0;unsignedc:4;inti;}data;abci233448又如:structpacked_data{unsigneda:2;unsignedb:3unsigned:2;unsignedc:4;inti;}data;abci232458第12章第6页