1、第八章 位运算,莆田学院现代教育技术中心2004年5月 制作,高级语言程序设计,莆田学院现代教育技术中心 2004年5月,本章主要内容,C语言既是一种高级语言,广泛应用于应用软件的开发和程序设计,同时又是一种低级语言,可以用于系统软件的开发和程序设计,如自动控制系统中的过程控制、参数检测、数据通讯等控制程序,都可以综合利用C语言中的指针操作、位运算和位段技术来实现。 本章介绍位运算的基本形式和常用运算符,并简要介绍位段的概念。位运算的深入学习,应该在计算机原理和汇编语言程序设计课程中进行。,莆田学院现代教育技术中心 2004年5月,一、位运算符和位运算,位运算概述 所谓“位运算”,是指按二进制
2、位进行运算。 位运算的特点:运算按二进制逐位进行没有借位和进位。 位运算量:整型(int,short,unsiged,long)/字符型(以补码/ASCII码形式存储),不可为实型。 位运算符:P298 表12.1& | ,莆田学院现代教育技术中心 2004年5月,一、位运算符和位运算,位运算符还可与赋值运算符相结合,进行位运算赋值操作。如:a&=b 等价于 a=a&b a=b 等价于 a=ab 注意:位运算时的数据类型为char/int,分析时要化为二进制形式,但在程序中书写及输出结果时仍为char/int。,莆田学院现代教育技术中心 2004年5月,位运算符的使用,按位与 & (均为1时方
3、为1),【例一】 main( ) unsigned char a,b;printf(“Enter a and b:”);scanf(“%o,%o”, ,计算 010 000 (a)& 011 000 (b) 010 000 001 010 (a)& 010 000 (b) 000 000,Enter a and b: 20,30 a&b=20,Enter a and b: 12,20 a&b=0,莆田学院现代教育技术中心 2004年5月,位运算符的使用,按位或 | (均为0时方为0),【例二】 main( ) unsigned char a,b;printf(“Enter a and b:”)
4、;scanf(“%o,%o”, ,Enter a and b: 20,30 a | b=30,Enter a and b: 12,20 a | b=32,计算010 000 (a)| 011 000 (b) 011 000 001 010 (a)| 010 000 (b) 011 010,莆田学院现代教育技术中心 2004年5月,位运算符的使用,按位异或 (二者相异方为1),【例三】以下程序的功能是将a数据的低4位取反。 #include main() unsigned char a=0x39, b= ;a=ab;printf(“%xn“, a); ,答案:0x0f,计算00111001 (a
5、) 00001111 (b) 00110110,莆田学院现代教育技术中心 2004年5月,位运算符的使用,按位取反 (各位反转),【例四】main( ) char a=3;int b=10;printf(“a=%d,b=%dn“,a,b);,结果:a=-4,b=-11,计算 a: 补码: 11111100 原码: 10000100 b: 补码:11110101 原码:10001011,莆田学院现代教育技术中心 2004年5月,位运算符的使用,左移运算 an 将a中各位向左移n位,右端补0,高位溢出丢弃。例:a= an (可写为a=n),相当于a2n(高位未溢出时),【例五】以下程序的运行结果是
6、 。 main() unsigned int a=0x3ef,b;b=a2;printf(“%x,%xn“,a,b); A)3ef,fb B) 3ef,fbc C) fbc,3ef D) fbc,fbc,结果:B,莆田学院现代教育技术中心 2004年5月,位运算符的使用,左移运算 ,【例六】以下程序的运行结果是 。 main() int a=12,b;b=0x1f5 ,结果:12,96,计算 已知:0x1f5为1 1111 0101 且:a为1100a3为1100000111110101 & 001100000001100000 = 96,莆田学院现代教育技术中心 2004年5月,位运算符的使
7、用,右移运算 an 将a中各位右移n位,溢出则舍弃。 左端 a为正数时(符号位为0),填0; a为负数时(符号位为1),填0或填1与系统有关填0(逻辑右移)填1(算术右移) TC使用算术右移,莆田学院现代教育技术中心 2004年5月,位运算符的使用,右移运算 ,【例七】以下程序的运行结果是 。 main() int a=9,b=-9;printf(“%d,%d“,a2,b2); ,结果:2,-3 (-9的补码 :1111111111110111,右移后为1111111111111101)。,莆田学院现代教育技术中心 2004年5月,应用示例, 从整数a最右端第m个位置开始取该位开始右面n位 。
8、算法如下: b=a(m-n+1)c=(0n)d=b&c注:位自右向左从0开始编号,莆田学院现代教育技术中心 2004年5月,应用示例, 将一个整数a循环右移n位。 算法如下: b=an c=c|b,莆田学院现代教育技术中心 2004年5月,二、位段,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度。这种以位为单位的成员称为“位段”。,莆田学院现代教育技术中心 2004年5月,示例,struct data int i; /*非位段*/unsigned int a:3; /*占3位*/unsigned int b:5; /*占5位*/unsigned int :3; /*无名位段不可用*/unsigned int c:2; /*占2位*/unsigned int :0; /*到下一字节起始处*/unsigned int d:3; /*占3位*/unsigned int :0; /*到下一字节起始处*/float f; /*非位段*/ ;,