第11章 位运算 为了节省内存空间,在系统软件中常将多个标志状态简单地组合在一起,存储到一个字节(或字)中。C语言是为研制系统软件而设计的,所以她提供了实现将标志状态从标志字节中分离出来的位运算功能。 所谓位运算是指,按二进制位进行的运算。 11.1 数值在计算机中的表示 11.2.

Slides:



Advertisements
Similar presentations
定 格 入 格 破 格 —— 新诗仿写复习训练 仿照下列句子,再把 “ 人生 ” 比喻成 “ 大海 ”“ 天空 ” , 造两个句子。 如果说人生是一首优美的乐曲,那么痛苦则 是其中一个不可或缺的音符。 参考答案: 1 、如果说人生是一望无际的大海,那么挫折则 是其中一个骤然翻起的浪花。 2 、如果说人生是一片湛蓝的天空,那么失意则.
Advertisements

企业文化与核心价值观 主讲:孟凡驰 教授 中交四航局. 2 目 录 一、企业文化的目的价值恒久性与工具价值实践性 二、企业文化管理学特征 三、企业文化与企业发展战略 四、企业文化整合、提炼、培育和建设的目的 五、集团文化与分公司文化 六、企业核心价值观.
第八章 组织文化的整合 ——并购中的文化整合(二) 小组成员:浦若蓉、朱谷一、贾彦彦.
一、平面点集 定义: x、y ---自变量,u ---因变量. 点集 E ---定义域, --- 值域.
“八皇后”问题 崔萌萌 吕金华.
Loops.
公关协调 能力目标 初步学会对内及对外公众关系协调的基本方法。 知识目标 掌握组织内外公众协调的原理和方法。
第一章 C语言概述 计算机公共教学部.
请将手机调整到静音状态 实验网站:program3.ccshu.net 资源网站:class.ccshu.org/ /
管理学基本知识.
第二节 工业地域的形成 工业联系 工业集聚 工业地域
當代國際企業.
滁州学院首届微课程教学设计竞赛 课程名称:高等数学 主讲人:胡贝贝 数学与金融学院.
华南区 2016校园宣讲会 宣讲会日期:.
拾貳、 教育行政 一、教育行政的意義 教育行政,可視為國家對教育事務的管理 ,以增進教育效果。 教育行政,乃是一利用有限資源在教育參
課程銜接 九年一貫暫行綱要( )  九年一貫課程綱要( ) 國立台南大學數學教育系 謝 堅.
2.4 二元一次方程组的应用(1).
C语言程序设计 第十二章 位运算.
C语言程序设计 课程 第5章 数组 主讲:李祥 博士、副教授 单位:软件学院软件工程系.
第一章 C语言概述.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
If … else 選擇結構 P27.
STRUCTURE 授課:ANT 日期:2010/5/12.
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
作弊是否很有诱惑性? 上堂课已经讲了 作业不一定在两个小时里都能完成 答疑没有一个人? 作弊是有记录的 心理系很多同学集体作弊,让人震惊
算法的基本概念.
第13章 结构体的应用 13.1 了解由用户构造的数据类型 13.2 结构体类型说明及结构体变量 13.3 结构体数组
第三节 整数类型.
計數式重複敘述 for 迴圈 P
第3章 顺序结构程序设计 为了让计算机处理各种数据,首先就应该把源数据输入到计算机中;计算机处理结束后,再将目标数据信息以人能够识别的方式输出。C语言中的输入输出操作,是由C语言编译系统提供的库函数来实现。 3.1 格式化输出——printf()函数 3.2 格式化输入——scanf()函数.
2.1 C语言的数据类型 2.2 常量与变量 2.3 变量赋初值 2.4 各类数值型数据间的混合运算 2.5 C语言的运算符和表达式
第七章 函数及变量存贮类型 7.1 函数基础与C程序结构 7.2 函数的定义和声明 7.3 函数的调用 7.4 函数的嵌套与递归
第4章 顺序程序设计.
第0章作业: 教材P12-练习与实践 1.写出用符号’*’输出描绘汉字”大”的流程图。
目录 9.1 结构体类型 9.2 共用体类型 9.3 枚举类型 9.4 类型声明符typedef 1.
C语言概述 第一章.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
1.2 C语言程序的结构与书写规则 一、 C语言程序的总体结构
C 语言程序设计 程序的循环结构 电大崇信县工作站 梁海亮.
C语言程序设计 教案 崔武子制作
第8章 位运算 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
指標
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
輸出與輸入(I/O).
C程序设计.
<编程达人入门课程> 本节内容 字符与字符串 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
本节内容 字符与字符串 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C语言程序设计 李祥 QQ:
第2章 数据类型、运算符与表达式 2.1 程序设计概述
第3章 数据类型、运算符与表达式.
第二章 类型、对象、运算符和表达式.
习 题 课(作业).
Introduction to the C Programming Language
第三章 基本的輸出與輸入函數 (Basic Output & Input Function)
知识产权在中小企业中的作用 讲座内容 一、知识产权在发达国家及知名企业中的地位 二、知识产权的基本概念及其特点
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第4章 顺序结构程序设计 为了让计算机处理各种数据,首先就应该把源数据输入到计算机中;计算机处理结束后,再将目标数据信息以人能够识别的方式输出。C语言中的输入输出操作,是由C语言编译系统提供的库函数来实现。 4.1 格式化输出——printf()函数 4.2 格式化输入——scanf()函数.
第3章 最简单的C程序设计 3.1 顺序程序设计举例 3.2 数据的表现形式及其运算 3.3 C语句 3.4 数据的输入输出.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
Introduction to the C Programming Language
第十二章 位运算.
目录 12.1 位运算符 12.2 位域(位段) 1.
第18讲 从C到C++ 计算机与通信工程学院.
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
用加減消去法解一元二次聯立方程式 台北縣立中山國中 第二團隊.
函式庫補充資料 1.
隨機函數.
Presentation transcript:

第11章 位运算 为了节省内存空间,在系统软件中常将多个标志状态简单地组合在一起,存储到一个字节(或字)中。C语言是为研制系统软件而设计的,所以她提供了实现将标志状态从标志字节中分离出来的位运算功能。 所谓位运算是指,按二进制位进行的运算。 11.1 数值在计算机中的表示 11.2 位运算 11.3 位段 [Return]

11.1 数值在计算机中的表示 1.二进制位与字节 计算机系统的内存储器,是由许多称为字节的单元组成的,1个字节由8个二进制位(bit)构成,每位的取值为0/1。最右端的那1位称为“最低位”,编号为0;最左端的那1位称为“最高位”,而且从最低位到最高位顺序,依次编号。图11-1是1个字节各二进制位的编号。 图11-1 1个字节各二进制位的编号 2.数值的原码表示 数值的原码表示是指,将最高位用作符号位(0表示正数,1表示负数),其余各位代表数值本身的绝对值(以二进制形式表示)的表示形式。为简化描述起见,本节约定用1个字节表示1个整数。 7 6 5 4 3 2 1

例如,+9的原码是00001001 3.数值的反码表示 └→符号位上的0表示正数 -9的原码是10001001。 └→符号位上的1表示负数 数值的反码表示分两种情况: (1)正数的反码:与原码相同。 例如,+9的反码是00001001。 (2)负数的反码:符号位为1,其余各位为该数绝对值的原码按位取反(1变0、0变1)。 例如,-9的反码:因为是负数,则符号位为“1”;其余7位为-9的绝对值+9的原码0001001按位取反为1110110,所以-9的反码是11110110。

4.数值的补码表示 数值的补码表示也分两种情况: (1)正数的补码:与原码相同。 例如,+9的补码是00001001。 (2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。 例如,-9的补码:因为是负数,则符号位为“1”;其余7位为-9的绝对值+9的原码0001001按位取反为1110110;再加1,所以-9的补码是11110111。 已知一个数的补码,求原码的操作分两种情况: (1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。 (2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位不变,其余各位取反,然后再整个数加1。

例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。 5.数值在计算机中的表示──补码 在计算机系统中,数值一律用补码表示(存储),原因在于:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。 [Return]

11.2 位 运 算 11.2.1 位运算及其运算符 1.按位与──& (1)格式:x&y (2)规则:对应位均为1时才为1,否则为0:3&9=1。 例如,3&9=1: 0011 & 1001 ──── 0001=1 (3)主要用途:取(或保留)1个数的某(些)位,其余各位置0。   2.按位或──| (1)格式:x|y (2)规则:对应位均为0时才为0,否则为1:3|9=11。 例如,3|9=11: 0011 | 1001 1011=11 (3)主要用途:将1个数的某(些)位置1,其余各位不变。

3.按位异或──^ (1)格式:x^y (2)规则:对应位相同时为0,不同时为1:3^9=10。 (3)主要用途:使1个数的某(些)位翻转(即原来为1的位变为0,为0的变为1),其余各位不变。 4.按位取反──~ (1)格式:~x (2)规则:各位翻转,即原来为1的位变成0,原来为0的位变成1:在IBM-PC机中,~0=0xffff,~9=0xfff6。 (3)主要用途:间接地构造一个数,以增强程序的可移植性。 5.按位左移──<< (1)格式:x<< 位数 (2)规则:使操作数的各位左移,低位补0,高位溢出:5<<2=20。

6.按位右移──>> (1)格式:x>>位数 (2)规则:使操作数的各位右移,移出的低位舍弃;高位: 1)对无符号数和有符号中的正数,补0; 2)有符号数中的负数,取决于所使用的系统:补0的称为“逻辑右移”,补1的称为“算术右移”。例如,20 >> 2=5。 说明: (1)x、y和“位数”等操作数,都只能是整型或字符型数据。除按位取反为单目运算符外,其余均为双目运算符。 (2)参与运算时,操作数x和y,都必须首先转换成二进制形式,然后再执行相应的按位运算。 例如,5<<2=20:0101 → 10100,20 >> 2=5:10100 → 00101。

(3)实现&、|、^运算主要用途的方法 1)构造1个整数:该数在要取(或保留)的位、或要置1的位、或要翻转的位上为1,其余均为0。 2)进行按位与、或按位或、或按位异或操作。 (4)实现按位取反主要用途的方法 1)求~0,间接地构造一个全1的数; 2)按需要进行左移或右移操作,构造出所需要的数。 例如,直接构造一个全1的数,在IBM-PC机中为0xffff(2字节),而在VAX-11/780上,却是0xffffffff(4字节)。如果用~0来构造,系统可以自动适应。具体应用,请参见[案例11.1]。 11.2.2 应用举例 [案例11.1] 从键盘上输入1个正整数给int变量num,输出由8~11位构成的数(从低位、0号开始编号)。

基本思路: (1)使变量num右移8位,将8~11位移到低4位上。 (2)构造1个低4位为1、其余各位为0的整数。 (3)与num进行按位与运算。 /*案例代码文件名:AL11_1.C*/ /*程序功能:输出一个整数中由8~11位构成的数*/ main() { int num, mask; printf("Input a integer number: "); scanf("%d",&num); num >>= 8; /*右移8位,将8~11位移到低4位上*/ mask = ~ ( ~0 << 4); /*间接构造1个低4位为1、其余各位为0的整数*/ printf("result=0x%x\n", num & mask); } [程序演示]

程序运行情况: Input a integer number:1000 ←┘ result=0x3 程序说明:~ ( ~0 << 4) 按位取0的反,为全1;左移4位后,其低4位为0,其余各位为1;再按位取反,则其低4位为1,其余各位为0。这个整数正是我们所需要的。 [案例11.2] 从键盘上输入1个正整数给int变量num,按二进制位输出该数。 /*案例代码文件名:AL11_2.C*/ /*程序功能:按二进制位输出一个整数*/

#include "stdio.h" main() { int num, mask, i; printf("Input a integer number: "); scanf("%d",&num); mask = 1<<15; /*构造1个最高位为1、其余各位为0的整数(屏蔽字)*/ printf("%d=" , num); for(i=1; i<=16; i++) { putchar(num&mask ? ’1’ : ‘0’); /*输出最高位的值(1/0)*/ num <<= 1; /*将次高位移到最高位上*/ if( i%4==0 ) putchar(‘,’); /*四位一组,用逗号分开*/ } printf("\bB\n"); } [程序演示]

[Return] 程序运行情况: Input a integer number:1000 ←┘ 11.2.3 说明 1.复合赋值运算符 除按位取反运算外,其余5个位运算符均可与赋值运算符一起,构成复合赋值运算符: &=、|+、^=、<<=、>>= 2.不同长度数据间的位运算──低字节对齐,短数的高字节按最高位补位: (1)对无符号数和有符号中的正数,补0; (2)有符号数中的负数,补1。 [Return]

11.3 位段简介 有时,存储1个信息不必占用1个字节,只需二进制的1个(或多个)位就够用。如果仍然使用结构类型,则造成内存空间的浪费。为此,C语言引入了位段类型。 1. 位段的概念与定义 所谓位段类型,是一种特殊的结构类型,其所有成员均以二进制位为单位定义长度,并称成员为位段。 例如,CPU的状态寄存器,按位段类型定义如下: struct status { unsigned sign: 1; /*符号标志*/ unsigned zero: 1; /*零标志*/ unsigned carry: 1; /*进位标志*/ unsigned parity: 1; /*奇偶/溢出标志*/ unsigned half_carry: 1; /*半进位标志*/ unsigned negative: 1; /*减标志*/ } flags;

显然,对CPU的状态寄存器而言,使用位段类型(仅需1个字节),比使用结构类型(需要6个字节)节省了5个字节。 2.说明 (1)因为位段类型是一种结构类型,所以位段类型和位段变量的定义,以及对位段(即位段类型中的成员)的引用,均与结构类型和结构变量一样。 (2)对位段赋值时,要注意取置范围。一般地说,长度为n的位段,其取值范围是:0~(2n-1)。 (3)使用长度为0的无名位段,可使其后续位段从下1个字节开始存储。 例如, struct status { unsigned sign: 1; /*符号标志*/ unsigned zero: 1; /*零标志*/ unsigned carry: 1; /*进位标志*/ unsigned : 0; /*长度为0的无名位段*/ unsigned parity: 1; /*奇偶/溢出标志*/ unsigned half_carry: 1; /*半进位标志*/ unsigned negative: 1; /*减标志*/ } flags;

原本6个标志位是连续存储在1个字节中的。由于加入了1个长度为0的无名位段,所以其后的3个位段,从下1个字节开始存储,一共占用2个字节。 (4)1个位段必须存储在1个存储单元(通常为1字节)中,不能跨2个。如果本单元不够容纳某位段,则从下1个单元开始存储该位段。 (5)可以用%d、%x、%u和%o等格式字符,以整数形式输出位段。 (6)在数值表达式中引用位段时,系统自动将位段转换为整型数。 [Return]