C语言程序设计-提高篇-第4章 位运算_第1页
C语言程序设计-提高篇-第4章 位运算_第2页
C语言程序设计-提高篇-第4章 位运算_第3页
C语言程序设计-提高篇-第4章 位运算_第4页
C语言程序设计-提高篇-第4章 位运算_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计

—提高篇第4章位运算内容概述位运算操作位段的概念

教学目标字节和位的有关概念;正确使用常见的位运算符和位运算操作;牢记位段的要领及位段的使用方法。C语言既是一种高级语言,广泛应用于应用软件的开发和程序设计,同时又是一种低级语言,可以用于系统软件的开发和程序设计,如自动控制系统中的过程控制、参数检测、数据通讯等控制程序,都可以综合利用C语言中的指针操作、位运算和位段技术来实现。本章介绍位运算的基本形式和常用运算符,并简要介绍位段的概念。位运算的深入学习,应该在《计算机原理》和《汇编语言程序设计》课程中进行。位运算概述所谓“位运算”,是指按二进制位进行运算。位运算的特点:运算按二进制逐位进行——没有借位和进位。位运算量:整型(int,short,unsiged,long)/字符型(以补码/ASCII码形式存储),不可为实型。4.1位运算符和位运算

位运算符(BitwiseOperators)运算符名称举例优先级~按位取反~flag(高)(算术运算符)<<左移a<<2>>右移b>>3(关系运算符)&按位与flag&0x37^按位异或flag^0xC4|按位或flag|0x5A(低)(赋值运算符)位运算符还可与赋值运算符相结合,进行位运算赋值操作。如:

a&=b等价于a=a&ba>>=b等价于a=a>>b位运算时的数据类型为char/int,分析时要化为二进制形式,但在程序中书写及输出结果时仍为char/int。负数以补码形式参与运算注意与逻辑运算区别按位与(BitwiseAND)运算规则0&0=0;0&1=0;1&0=0;1&1=1;用法按位清零保留某些指定位位运算符的使用例1#include<stdio.h>voidmain(){

int

a,b;

printf("Enteraandb:");

scanf("%d,%d",&a,&b);

printf("a&b=%d\n",a&b);}计算

010000(a)&011111(b)010000

001010(a)&010000(b)000000Enteraandb:16,31a&b=16Enteraandb:10,16a&b=0按位或(BitwiseInclusiveOR)运算规则0|0=0;0|1=1;1|0=1;1|1=1;用法按位定值为1例2#include<stdio.h>voidmain(){unsignedchara,b;

printf("Enteraandb:");

scanf("%o,%o",&a,&b);

printf("a|b=%o\n",a|b);}Enteraandb:20,30a|b=30Enteraandb:12,20a|b=32计算

010000(a)|011000(b)011000

001010(a)|010000(b)011010按位异或(BitwiseExclusiveOR,XOR)运算规则0^0=0;0^1=1;1^0=1;1^1=0;说明相“异”则为1,相“同”则为0例3以下程序的功能是将a数据的低4位取反。#include<stdio.h>voidmain(){unsignedchara=0x39,b=

;a=a^b;

printf("%x\n",a);}答案:0x0f

计算

00111001(a)^00001111(b)00110110与0相异或,保持原值不变与自身相异或,则全部位清零交换两个整数值a=a^b;b=b^a;a=a^b;交换两个整数值不用临时变量#include<stdio.h>voidmain(){

inta=3,b=4;a=a^b; b=b^a; a=a^b;

printf(“a=%db=%d\n",a,b);}结果:a=4b=3按位取反(One'sComplement)运算规则~0=1;~1=0;用法所有位翻转获得适用于不同系统的位运算模板例4#include<stdio.h>voidmain(){

inta=32767;

intb=~a;

printf("a=%d,b=%d\n",a,b);}结果:a=32767,b=-32768

计算a:原码:0111111111111111b:补码:1000000000000000左移(LeftShift)运算规则i<<n把i各位全部向左移动n位最左端的n位被移出丢弃最右端的n位用0补齐用法若没有溢出,则左移n位相当于乘上2n运算速度比真正的乘法和幂运算快得多例5以下程序的运行结果是

60。#include<stdio.h>voidmain(){ unsignedinta=15,b; b=a<<2;

printf("%d,%d\n",a,b);}例6以下程序的运行结果是

。#include<stdio.h>voidmain(){

inta=12,b; b=0x1f5&a<<3;

printf("%d,%d\n",a,b);}结果:12,96计算已知:0x1f5为111110101且:∵a为1100∴a<<3为1100000111110101&001100000001100000=96右移(RightShift)运算规则i>>n把i各位全部向右移动n位最右端的n位被移出丢弃最左端的n位用0补齐(逻辑右移)或最左端的n位用符号位补齐(算术右移)用法右移n位相当于除以2n,并舍去小数部分运算速度比真正的除法和幂运算快得多例7以下程序的运行结果是

4,5。#include<stdio.h>voidmain(){

inta=16,b=20;

printf("%d,%d",a>>2,b>>2);}应用示例①从整数a最右端第m个位置开始取该位开始右面n位。算法如下:

b=a>>(m-n+1)c=~(~0<<n)d=b&c

注:位自右向左从0开始编号应用示例②将一个整数a循环右移n位。算法如下:b=a<<(16-n)c=a>>nc=c|b

例8:将16进制短整数按二进制打印输出 输入:F1E2

输出:1111000111100010

输入:13A5

输出:0001001110100101算法思想:从高位到低位逐位测试每一位是0或是1。可顺次设置屏蔽字分别为100000000000

0000、010000000000

0000、……、00000000

00000001,与该数进行&运算,从而保留所需的一个位的状态(其余各位为0)。若结果非零则输出1,否则输出0。#include<stdio.h>voidmain(){

inti; shorta;

scanf("%X",&a); for(i=15;i>=0;i--) printf("%1d",a&1<<i?1:0);}C语言允许在一个结构体中以位为单位来指定其成员所占内存长度。这种以位为单位的成员称为“位段”。4.2位段

位段的概念1.位段的含义位段是以位为单位定义长度的结构体类型中的成员.2、位段的构成例如:structpack{unsigneda:2;unsignedb:6;unsignedc:8;

intx;}data;这个结构体类型的变量在内存中的情况为:abcx26816也可以使各个字段不恰好占满一个字节structpack{unsigneda:2;unsignedb:6;unsignedc:4;

intx;}data;则内存中的分配形式为:此处:a,b,c共占2个字节中的12位,空闲4位,

int型的x从一个新的字节开始.abcx26416空闲4对位段中数据的引用方法1、方法:通过结构体成员来应用:如:data.a=2;data.b=6;2、要点:注意每个字段的最大取值范围.

如:data.a的取值只能是:0~3,

因为两位二进制最大表示的数为3. 1.若某个位段要从新的存储单元开始,可以这样定义:structpack{unsigneda:2;unsigned:0;unsignedb:4;unsignedc:4;intx;}data;注意:长度为0的位段的作用是使下一个位段的内容从新的存储单元开始存放。位段的使用要点位段的使用要点2.一个位段存储在同一个机器字中,不能跨字存储.如下面的定义是错误的(假设机器的字长为16位)structpack{unsigneda:2;unsignedb:5;unsignedc:10;unsignedd:4;

intx;}data;3.可以定义无名字段structpack{unsigneda:2;unsigned:5;/*空闲不用*/unsignedb:2;unsignedc:4;

intx;}data;位段的使用要点4.位段可以用十进制的整型形式输出,也可以用其他的整型格式输出(如八进制,十六进制和无符号),位段以整型的形式参加算术运算.分析下面的程序:例9:voidmain(){structpack{unsigneda:2;unsignedb:3;unsignedc:1;unsignedd:4;unsignede:3;};

union{structpackqp;unsignedi;}abc;

abc.i=255;

printf(“%d\n”,abc.qp.d);}位段的使用要点例10:分析下列程序的输出结果#defineN2#defineCUBE(X)(X*X*X)#include<stdio.h>voidmain(){

inti=N+2; i=CUBE(i);

printf("%d\n",i);}运行结果为:64

例11:下列程序的输出结果是什么?#include<stdio.h>voidmain(){structequip

{unsigneda:2;

unsignedb:3;

unsignedc:1;

unsignedd:4;

unsignede:3;

unsigned:3;};

union

{structequipeq;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论