《C语言教程位运算.ppt》由会员分享,可在线阅读,更多相关《C语言教程位运算.ppt(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第八章 位运算 语言程序设计语言程序设计莆田学院计算机教研室 2003年6月本章主要内容nC语言既是一种高级语言,广泛应用于应用软件的开发和程序设计,同时又是一种低级语言,可以用于系统软件的开发和程序设计,如自动控制系统中的过程控制、参数检测、数据通讯等控制程序,都可以综合利用C语言中的指针操作、位运算和位段技术来实现。n本章介绍位运算的基本形式和常用运算符,并简要介绍位段的概念。一、位运算符和位运算n位运算概述所谓“位运算”,是指按二进制位进行运算。位运算的特点:运算按二进制逐位进行没有借位和进位。位运算量:整型(int,short,unsiged,long)/字符型(以补码/ASCII码形
2、式存储),不可为实型。位运算符:P298 表12.1&|一、位运算符和位运算n位运算符还可与赋值运算符相结合,进行位运算赋值操作。如:a&=b 等价于 a=a&b a=b 等价于 a=abn注意:位运算时的数据类型为char/int,分析时要化为二进制形式,但在程序中书写及输出结果时仍为char/int。位运算符的使用n按位与&(均为1时方为1)【例一】main()unsigned char a,b;printf(“Enter a and b:”);scanf(“%o,%o”,&a,&b);printf(“a&b=%on”,a&b);计算 00010000(a)&00011000(b)0001
3、0000 00001010(a)&00010000(b)00000000 Enter a and b:20,30a&b=20Enter a and b:12,20a&b=0位运算符的使用n按位或|(均为0时方为0)【例二】main()unsigned char a,b;printf(“Enter a and b:”);scanf(“%o,%o”,&a,&b);printf(“a|b=%on”,a|b);Enter a and b:20,30a|b=30Enter a and b:12,20a|b=32计算 00010000(a)|00011000(b)00011000 00001010(a)|
4、00010000(b)00011010 位运算符的使用n按位异或 (二者相异方为1)【例三】以下程序的功能是将a数据的低4位取反。#include main()unsigned char a=0 x39,b=;a=ab;printf(%xn,a);答案:0 x0f 计算 00111001(a)00001111(b)00110110 位运算符的使用n按位取反 (各位反转)【例四】main()char a=3;int b=10;printf(“a=%d,b=%dn,a,b);结果:a=-4,b=-11 计算 a:补码:11111100原码:10000100 b:补码:11110101原码:1000
5、1011位运算符的使用n左移运算 an 将a中各位向左移n位,右端补0,高位溢出丢弃。例:a=an(可写为a=n),相当于a2n(高位未溢出时)【例五】以下程序的运行结果是 。main()unsigned int a=0 x3ef,b;b=a2;printf(%x,%xn,a,b);A)3ef,fb B)3ef,fbc C)fbc,3ef D)fbc,fbc结果:B 位运算符的使用n左移运算 【例六】以下程序的运行结果是 。main()int a=12,b;b=0 x1f5&a3;printf(%d,%dn,a,b);结果:12,96计算已知:0 x1f5为1 1111 0101且:a为110
6、0 a an 将a中各位右移n位,溢出则舍弃。左端a为正数时(符号位为0),填0;a为负数时(符号位为1),填0或填1与系统有关 填0(逻辑右移)填1(算术右移)TC使用算术右移位运算符的使用n右移运算【例七】以下程序的运行结果是 。main()int a=9,b=-9;printf(%d,%d,a2,b2);结果:2,-3(-9的补码:,右移后为)。应用示例 从整数a最右端第m个位置开始取该位开始右面n位。算法如下:b=a(m-n+1)c=(0n)d=b&c 注:位自右向左从0开始编号应用示例 将一个整数a循环右移n位。算法如下:b=anc=c|b 二、位段nC语言允许在一个结构体中以位为单
7、位来指定其成员所占内存长度。这种以位为单位的成员称为“位段”。示例 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;/*非位段*/;n引用:x.a x.b=1 x.d=7n(注意:如果x.d=8,则将出现“溢出”使x.d=0)