第十二章 位运算.

Slides:



Advertisements
Similar presentations
第十一课 公正处理民事关系. 听歌曲《我想有个家》,阅读结婚誓词,回答 : 如何才能拥有一个幸福、温馨的家庭? 导 入 导 入 探究活动一:幸福、温馨家庭的讨论 亲情和爱情的精心维护 法律的有力保护 品味 与 感悟 家庭是父亲 的王国,母 亲的世界, 儿童的乐园 。 —— 爱默生.
Advertisements

首页 全国高等学校招生考试统一考试 监考员培训 广州市招生考试委员会办公室.
人口增长.
诚信为本、操守为重、坚持准则、不做假账 第 九 章 会 计 报 表.
第一章 专利的种类 一、发明专利 20年 二、实用新型专利 10年 三、外观设计专利 10年
3.2 农业区位因素与农业地域类型.
第一章 会计法律制度 补充要点.
二、个性教育.
2011年10月31日是一个令人警醒的日子,世界在10月31日迎来第70亿人口。当日凌晨,成为象征性的全球第70亿名成员之一的婴儿在菲律宾降生。 ?
江苏省2008年普通高校 招生录取办法 常熟理工学院学生处
我为何为我?——那些历史并没有消失,它们就存在于我们心灵最隐秘的地方,时时在引导我们的行为准则,在操纵着我们的喜怒哀乐。
小论文的选题技巧与写作要领.
财经法规与会计职业道德 (7) 四川财经职业学院.
新准则框架与首次执行 企业会计准则 主讲人:陈清宇.
初级会计实务 第八章 产品成本核算 主讲人:杨菠.
第一章 C语言概述 计算机公共教学部.
问题解决与创造思维 刘 国 权 吉林省高等学校师资培训中心.
中考阅读 复习备考交流 西安铁一中分校 向连吾.
第四单元 自觉依法律己 避免违法犯罪.
交通事故處置 當事人責任與損害賠償 屏東縣政府警察局交通隊.
主题七 关注三农,重视民生 .
财经法规与会计职业道德 (3) 四川财经职业学院.
中央广播电视大学开放教育 成本会计(补修)期末复习
第四单元 当代国际社会 第八课 走进国际社会.
人教版义务教育课程标准实验教科书 小学数学四年级上册第七单元《数学广角》 合理安排时间 248.
第一节 正名——文字学与汉字学 第二节 本学期讲授内容及安排 附录:参考书目 作业
面向海洋的开放地区——珠江三角洲 山东省高青县实验中学:郑宝田.
第十二单元 第28讲 第28讲 古代中国的科技和文艺   知识诠释  思维发散.
线索一 线索二 复习线索 专题五 线索三 模块二 第二部分 考点一 高考考点 考点二 考点三 配套课时检测.
第四课时 常见天气系统 阜宁一中 姚亚林.
中考语文积累 永宁县教研室 步正军 2015.9.
存货的核算 一、项目任务 1、原材料核算 ——按实际成本核算 ——按计划成本核算 2、低值易耗品及包装物核算 3、存货清查的核算
小学数学知识讲座 应用题.
苏教版小学数学六年级(下册) 认识正比例的量 执教者:朱勤.
倒装句之其他句式.
旅游服务与管理专业 知识点7 道教教主老子圣迹 任务三 道 教 主题二 中国四大宗教 辉县市职业中等专业学校 辉县市职业中等专业学校
高点定位 精准发力 扎实推进优质均衡再上新台阶 ——全县初中教学工作会议讲话
第 22 课 孙中山的民主追求 1 .近代变法救国主张的失败教训: “师夷之长技以制 夷”“中体西用”、兴办洋务、变法维新等的失败,使孙中山
C语言程序设计 第十二章 位运算.
高级语言程序设计 主讲人:陈玉华.
第三节 整数类型.
第三章 数据类型、运算符与表达式.
2.1 C语言的数据类型 2.2 常量与变量 2.3 变量赋初值 2.4 各类数值型数据间的混合运算 2.5 C语言的运算符和表达式
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
知识点二 国际环境法的实施.
第2章 数据类型及表达式 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
第二十三章 旋转 图形的旋转 北京大学附属中学 鲍敬谊.
第11章 位运算 为了节省内存空间,在系统软件中常将多个标志状态简单地组合在一起,存储到一个字节(或字)中。C语言是为研制系统软件而设计的,所以她提供了实现将标志状态从标志字节中分离出来的位运算功能。 所谓位运算是指,按二进制位进行的运算。 11.1 数值在计算机中的表示 11.2.
第8章 位运算 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
指標
C语言程序设计 李祥 QQ:
基础会计.
大綱:整數的加法 整數的減法 蘇奕君 台灣數位學習科技股份有限公司
第3章 数据类型、运算符与表达式.
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
第二章 类型、对象、运算符和表达式.
第二章 基本数据类型 ——数据的表示.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第八节 算术运算符和算术表达式.
1.理解力和运动的关系,知道物体的运动不需要力来维持。
分配律 ~ 觀念 15 × 15 × + 15 × 乘法公式 蘇德宙 老師 台灣數位學習科技股份有限公司
坚持,努力,机会留给有准备的人 第一章 四大金融资产总结 主讲老师:陈嫣.
106學年度中區工作坊PART1 素養導向教學示例 -分享與實作- 分享人:周雅釧.
美丽的旋转.
第8章位运算 教学目的与要求: 1.熟练掌握六种位运算符及其使用方法 2.了解位段的使用方法.
目录 12.1 位运算符 12.2 位域(位段) 1.
畢氏定理(百牛大祭)的故事 張美玲 製作 資料來源:探索數學的故事(凡異出版社).
102年人事預算編列說明 邁向頂尖大學辦公室製作.
Presentation transcript:

第十二章 位运算

主要内容 12.1位运算符和位运算 12.2位运算举例 12.3位段

概念 位运算是指按二进制位进行的运算。因为在系统软件中,常要处理二进制位的问题。 例如:将一个存储单元中的各二进制位左移或右移一位,两个数按位相加等。 C语言提供位运算的功能,与其他高级语言(如PASCAL)相比,具有很大的优越性。

12.1 位运算符和位运算 C语言提供的位运算符有: 说明: 运算符 含义 运算符 含义 & 按位与 ~ 取反 运算符 含义 运算符 含义 & 按位与 ~ 取反 | 按位或 << 左移 ∧ 按位异或 >> 右移 说明: (1)位运算符中除~以外,均为二目(元)运算符,即要求两侧各有一个运算量。 (2)运算量只能是整型或字符型的数据,不能为实型数据。

12.1.1“按位与”运算符(&) 例:3&5并不等于8,应该是按位与运算: 按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。即: 0&0=0,0&1=0,1&0=0,1&1=1 例:3&5并不等于8,应该是按位与运算: 00000011(3) & 00000101(5) 00000001(1) 注意:如果参加&运算的是负数(如-3&-5),则要以补码形式表示为二进制数,然后再按位进行“与”运算。 3&5的值得1

按位与的用途: (1) 清零。  若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合以下条件:原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。  例: 原有数为00101011,另找一个数,设它为10010100,这样在原数为1的位置上,该数的相应位值均为0。将这两个数进行&运算: 00101011 & 10010100 00000000

如有一个整数a(2个字节),想要取其中的低字节,只需将a与8个1按位与即可。 (2) 取一个数中某些指定位。 如有一个整数a(2个字节),想要取其中的低字节,只需将a与8个1按位与即可。 0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0 a b c 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0

(3)保留一位的方法:与一个数进行&运算,此数在该位取1。 例:有一数01010100,想把其中左面第3、4、5、7、8位保留下来,运算如下: 01010100(84) & 00111011(59) 00010000(16) 即:a=84,b=59 c=a&b=16

12.1.2 “按位或”运算符(|) 两个相应的二进制位中只要有一个为1,该位的结果值为1。 即 0|0=0,0|1=1,1|0=1,1|1=1 例: 060|017,将八进制数60与八进制数17进行按位或运算。 00110000 | 00001111 00111111

应用:按位或运算常用来对一个数据的某些位定值为1。例如:如果想使一个数a的低4位改为1,只需将a与017进行按位或运算即可。 例: a是一个整数(16位), 有表达式:a | 0377 则低8位全置为1,高8位保留原样。

12.1.3“异或”运算符(∧) 即:0∧0=0,0∧1=1,1∧0=1, 1∧1=0 例: 即:071∧052=023 (八进制数) 异或运算符∧也称XOR运算符。它的规则是: 若参加运算的两个二进制位同号则结果为0(假) 异号则结果为1(真) 即:0∧0=0,0∧1=1,1∧0=1, 1∧1=0 例: 00111001 ∧ 00101010 00010011 即:071∧052=023 (八进制数)

设有01111010,想使其低4位翻转,即1变为0,0变为1。可以将它与00001111进行∧运算,即: ∧运算符应用: (1) 使特定位翻转  设有01111010,想使其低4位翻转,即1变为0,0变为1。可以将它与00001111进行∧运算,即: 运算结果的低4位正好是原数低4位的翻转。可见,要使哪几位翻转就将与其进行∧运算的该几位置为1即可。 01111010 ∧ 00001111 01110101

(2) 与0相∧,保留原值 例如:012∧00=012 00001010 因为原数中的1与0进行∧运算得1,0∧0得0,故保留原数。 ∧ 00000000  因为原数中的1与0进行∧运算得1,0∧0得0,故保留原数。

(3) 交换两个值,不用临时变量 例如:a=3,b=4。 想将a和b的值互换,可以用以下赋值语句实现: a=a∧b; b=b∧a; a=011 (∧)b=100 a=111(a∧b的结果,a已变成7) b=011(b∧a的结果,b已变成3) (∧)a=111 a=100(a∧b的结果,a已变成4)

即等效于以下两步: ① 执行前两个赋值语句:“a=a∧b;”和“b=b∧a;”相当于b=b∧(a∧b)。 ② 再执行第三个赋值语句: a=a∧b。由于a的值等于(a∧b),b的值等于(b∧a∧b),因此,相当于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,等于b。 a得到b原来的值。

12.1.4 “取反”运算符(~) ~是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变1,将1变0。例如,~025是对八进制数25(即二进制数00010101)按位求反。 0000000000010101 (~)   1111111111101010 (八进制数177752)

左移运算符是用来将一个数的各二进制位全部左移若干位。 12.1.5 左移运算符(<<) 左移运算符是用来将一个数的各二进制位全部左移若干位。 例如:a=<<2 将a的二进制数左移2位,右补0。 若a=15,即二进制数00001111, 左移2位得00111100,(十进制数60)   高位左移后溢出,舍弃。

12.1.5 左移运算符(<<) 左移1位相当于该数乘以2,左移2位相当于该数乘以22=4,15<<2=60,即乘了4。但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。 假设以一个字节(8位)存一个整数,若a为无符号整型变量,则a=64时,左移一位时溢出的是0,而左移2位时,溢出的高位中包含1。

12.1.6 右移运算符(>>) 右移运算符是a>>2表示将a的各二进制位右移2位,移到右端的低位被舍弃,对无符号数,高位补0。 例如:a=017时: a的值用二进制形式表示为00001111, 舍弃低2位11: a>>2=00000011  右移一位相当于除以2 右移n位相当于除以2n。

在右移时,需要注意符号位问题: 对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的系统移入1。移入0的称为“逻辑右移”,即简单右移;移入1的称为“算术右移”。

例: a的值是八进制数113755: a:1001011111101101 (用二进制形式表示) 在有些系统中,a>>1得八进制数045766,而在另一些系统上可能得到的是145766。Turbo C和其他一些C编译采用的是算术右移,即对有符号数右移时,如果符号位原来为1,左面移入高位的是1。

12.1.7 位运算赋值运算符 例如: &=, |=, >>=, <<=, ∧= 12.1.7 位运算赋值运算符   位运算符与赋值运算符可以组成复合赋值运算符。 例如: &=, |=, >>=, <<=, ∧= 例: a & = b相当于 a = a & b a << =2相当于a = a << 2

12.1.8 不同长度的数据进行位运算 如果两个数据长度不同(例如long型和int型),进行位运算时(如a & b,而a为long型,b为int型),系统会将二者按右端对齐。如果b为正数,则左侧16位补满0;若b为负数,左端应补满1;如果b为无符号整数型,则左侧添满0。

12.2 位运算举例 例12.1 取一个整数a从右端开始的4~7位 ① 先使a右移4位:a >> 4 目的是使要取出的那几位移到最右端 未右移时的情况 右移4位后的情况

(a >> 4) & ~ ( ~ 0 << 4 ) ② 设置一个低4位全为1,其余全为0的数。 ~ ( ~ 0 << 4 ) ③ 将上面①、②进行&运算。 (a >> 4) & ~ ( ~ 0 << 4 )  程序如下: #include <stdio.h> void main() { unsigned a,b,c,d; scanf(“%o”,&a); b=a>>4; c=~(~0<<4); d=b&c; printf(“%o,%d\n%o,%d\n”,a,a,d,d); 运行情况如下:331(输入) 331, 217 (a的值) 15, 13 (d的值) 输入a的值为八进制数331, 其二进制形式为11011001 经运算最后得到的d为00001101 即八进制数15,十进制数13。

例12.2 循环移位。 要求将a进行右循环移位 将a右循环移n位,即将a中原来左面(16-n)位右移n位,原来右端n位移到最左面n位。

步骤: ① 将a的右端n位先放到b中的高n位中,实现语句:b=a<<(16-n); ② 将a右移n位,其左面高位n位补0, 实现语句:c=a>>n; ③ 将c与b进行按位或运算,即c=c|b;

#include <stdio.h> void main() { unsigned a,b,c; int n; 程序如下: #include <stdio.h> void main() { unsigned a,b,c; int n; scanf(“a=%o,n=%d”,&a,&n); b=a<<(16-n); c=a>>n; c=c|b; printf(“%o\n%o”,a,c); } 运行情况如下: a=157653,n=3 15765 3 75765  运行开始时输入八进制数157653, 即二进制数1101111110101011 循环右移3位后得二进制数0111101111110101 即八进制数75765

12.3 位段 信息的存取一般以字节为单位。实际上,有时存储一个信息不必用一个或多个字节,例如,“真”或“假”用0或1表示,只需1位即可。在计算机用于过程控制、参数检测或数据通信领域时,控制信息往往只占一个字节中的一个或几个二进制位,常常在一个字节中放几个信息。

怎样向一个字节中的一个或几个二进制位赋值和改变它的值呢?可以用以下两种方法: 可以人为地将一个整型变量data分为几部分。 但是用这种方法给一个字节中某几位赋值太麻烦。可以位段结构体的方法。   (2)位段 C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域” ( bit field) 。利用位段能够用较少的位数存储数据。

程序如下: struct packed-data { unsigned a:2; unsigned b:6; unsigned c:4; unsigned d:4; int i; }data; 

关于位段的定义和引用的说明: (1)位段成员的类型必须指定为unsigned或int类型。 (2) 若某一位段要从另一个字开始存放,可用以下形式定义: unsigned a:1; unsigned b:2;一个存储单元 unsigned:0; unsigned c:3;另一存储单元   a、b、c应连续存放在一个存储单元中,由于用了长度为0的位段,其作用是使下一个位段从下一个存储单元开始存放。因此,只将a、b存储在一个存储单元中,c另存在下一个单元(“存储单元”可能是一个字节,也可能是2个字节,视不同的编译系统而异)。  

关于位段的定义和引用的说明: (3) 一个位段必须存储在同一存储单元中,不能跨两个单元。如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。 (4) 可以定义无名位段。 (5) 位段的长度不能大于存储单元的长度,也不能定义位段数组。 (6) 位段可以用整型格式符输出。 (7) 位段可以在数值表达式中引用,它会被系统自动地转换成整型数。