第8章位运算 教学目的与要求: 1.熟练掌握六种位运算符及其使用方法 2.了解位段的使用方法.

Slides:



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

一、模型与计算公式 二、基本的组合分析公式 三、概率直接计算的例子 第 1.3 节 古典概率 四、抽签与顺序无关 五、二项分布与超几何分布 六、概率的基本性质.
林園高中適性入學 高雄區免試入學 及 特色招生介紹 1. 國中學生 國中教育會考 1 ( 每年五月 ) 特色招生 術科考試 五專 免試入學 ( 每年六月 ) 特色招生 甄選入學 高中高職 免試入學 擇一報到 林園高中適性入學  入學管道流程 2.
首页 全国高等学校招生考试统一考试 监考员培训 广州市招生考试委员会办公室.
人口增长.
诚信为本、操守为重、坚持准则、不做假账 第 九 章 会 计 报 表.
第一章 专利的种类 一、发明专利 20年 二、实用新型专利 10年 三、外观设计专利 10年
3.2 农业区位因素与农业地域类型.
2 016 陕西广播电视台 餐饮娱乐行业广播投放方案 【第一版】.
第一章 会计法律制度 补充要点.
阅读题中的 分类讨论思想 主讲:里水中学 林沛娴.
二、个性教育.
2011年10月31日是一个令人警醒的日子,世界在10月31日迎来第70亿人口。当日凌晨,成为象征性的全球第70亿名成员之一的婴儿在菲律宾降生。 ?
第三节 大气的运动 一、大气运动 二、热力环流 三、大气的水平运动——风.
江苏省2008年普通高校 招生录取办法 常熟理工学院学生处
我为何为我?——那些历史并没有消失,它们就存在于我们心灵最隐秘的地方,时时在引导我们的行为准则,在操纵着我们的喜怒哀乐。
第 三 节 电磁铁的应用.
财经法规与会计职业道德 (7) 四川财经职业学院.
新准则框架与首次执行 企业会计准则 主讲人:陈清宇.
初级会计实务 第八章 产品成本核算 主讲人:杨菠.
问题解决与创造思维 刘 国 权 吉林省高等学校师资培训中心.
中考阅读 复习备考交流 西安铁一中分校 向连吾.
第四单元 自觉依法律己 避免违法犯罪.
交通事故處置 當事人責任與損害賠償 屏東縣政府警察局交通隊.
主题七 关注三农,重视民生 .
紧扣课程标准 关注社会热点 —苏教版教材新增内容复习建议 南京市南湖第一中学 马 峰.
企业税收筹划与税务风险管理 暨南大学财税系 沈肇章.
财经法规与会计职业道德 (3) 四川财经职业学院.
民法总论 北京师范大学珠海分校 法律与行政学院 白 非.
中央广播电视大学开放教育 成本会计(补修)期末复习
第四单元 当代国际社会 第八课 走进国际社会.
人教版义务教育课程标准实验教科书 小学数学四年级上册第七单元《数学广角》 合理安排时间 248.
第一节 正名——文字学与汉字学 第二节 本学期讲授内容及安排 附录:参考书目 作业
面向海洋的开放地区——珠江三角洲 山东省高青县实验中学:郑宝田.
《7.1 力》说课稿 丰城中学 杨青青.
第十二单元 第28讲 第28讲 古代中国的科技和文艺   知识诠释  思维发散.
线索一 线索二 复习线索 专题五 线索三 模块二 第二部分 考点一 高考考点 考点二 考点三 配套课时检测.
商品和商品经济 宜都市第二中学 制作:艾之友
第四课时 常见天气系统 阜宁一中 姚亚林.
中考语文积累 永宁县教研室 步正军 2015.9.
A B~A B
存货的核算 一、项目任务 1、原材料核算 ——按实际成本核算 ——按计划成本核算 2、低值易耗品及包装物核算 3、存货清查的核算
小学数学知识讲座 应用题.
苏教版小学数学六年级(下册) 认识正比例的量 执教者:朱勤.
倒装句之其他句式.
幼儿心理学.
旅游服务与管理专业 知识点7 道教教主老子圣迹 任务三 道 教 主题二 中国四大宗教 辉县市职业中等专业学校 辉县市职业中等专业学校
高点定位 精准发力 扎实推进优质均衡再上新台阶 ——全县初中教学工作会议讲话
甲年基督聖體聖血節進堂詠 上主要以上等的麥麵養育選民, 用石縫中的野蜜飽飫他們。.
第四章第一节 增值税法律制度2 主讲老师:梁天 经济法基础.
第 22 课 孙中山的民主追求 1 .近代变法救国主张的失败教训: “师夷之长技以制 夷”“中体西用”、兴办洋务、变法维新等的失败,使孙中山
C语言程序设计 第十二章 位运算.
語法與修辭 骨&肉 老師:歐秀慧.
體育科教學軟件 乒乓球.
知识点二 国际环境法的实施.
第8章 位运算 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
基础会计.
大綱:整數的加法 整數的減法 蘇奕君 台灣數位學習科技股份有限公司
第八节 算术运算符和算术表达式.
1.理解力和运动的关系,知道物体的运动不需要力来维持。
分配律 ~ 觀念 15 × 15 × + 15 × 乘法公式 蘇德宙 老師 台灣數位學習科技股份有限公司
第十二章 位运算.
坚持,努力,机会留给有准备的人 第一章 四大金融资产总结 主讲老师:陈嫣.
106學年度中區工作坊PART1 素養導向教學示例 -分享與實作- 分享人:周雅釧.
美丽的旋转.
目录 12.1 位运算符 12.2 位域(位段) 1.
第三章 植物的激素调节.
第二十七章 相 似 27.3 位 似 第2课时 平面直角坐标系中的位似.
畢氏定理(百牛大祭)的故事 張美玲 製作 資料來源:探索數學的故事(凡異出版社).
102年人事預算編列說明 邁向頂尖大學辦公室製作.
Presentation transcript:

第8章位运算 教学目的与要求: 1.熟练掌握六种位运算符及其使用方法 2.了解位段的使用方法

基本内容 一、位运算符 二、位段 三、本章小结 前面介绍的各种运算都是以字节作为最基本单位进行的。 但在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。   所谓位运算是指进行二进制位的运算。在系统软件中,常要处理二进位的问题。C语言提供位运算的功能,与其它高级语言相比,显然具有很大的优越性。 一、位运算符 二、位段 三、本章小结 结束

一、位运算符 C语言提供了六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移        C语言提供了六种位运算符:      & 按位与     | 按位或     ^ 按位异或     ~ 取反     << 左移     >> 右移 说明: (1)位运算除取反运算外,均为二目(元)运算符。 (2)运算量只能是整型或字符型的数据,不能为实型数据。

1.按位与运算符(&)   按位与运算符“&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。 即: 0&0=0; 0&1=0; 1&0=0; 1&1=1 例如:9&5可写算式如下: 00001001 (9的二进制补码) &00000101 (5的二进制补码) 00000001 (1的二进制补码) 可见9&5=1。

按位与的用途: (1)清零。 (2)取一个数中某些指定位。 (3)保留某些位。   如果想将一个单元清零,只要让该单元的数与0进行进行与运算即可达到清零目的。若想取指定的某些位或保留某些位,只要让这些位与1进行与运算即可。 例如:把整数a(=517) 的高八位清 0 ,保留低八位,可作a&255运算( 255 的二进制数为0000000011111111)。 0000001000000101 (&)0000000011111111 —————————— 0000000000000101

2.按位或运算符(|)   按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的两个二进位有一个为1时,结果位就为1。 即: 0|0=0; 0|1=1; 1|0=1; 1|1=1 例如:9|5可写算式如下: 00001001 (9的二进制补码) (|)00000101 (5的二进制补码) —————————— 00001101 (1的二进制补码) 可见9|5=13。 按位或运算常用来对一个数据的某些位定值为1。

3.按位异或运算符(^) 按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。   按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 即: 0^0=0; 0^1=1; 1^0=1; 1^1=0 例如:9^5可写算式如下: 00001001 (9的二进制补码) (^)00000101 (5的二进制补码) —————————— 00001100 (1的二进制补码) 可见9^5=12。

^运算符的应用: (1)使特定位翻转。例如: (2)与0相^,保留原值。例如: (3)交换两个值,不用临时变量。例如: 假如a=3,b=4。想将a和b的值互换,可以用以下赋值语句实现:a=a^b; b=b^a; a=a^b; 上面三个语句等效与以下两步: b=b^(a^b)=b^a^b=a^b^b=a^0(应用(2)) =a a=a^b=(a^b)^(b^a^b)=a^b^b^a^b=a^a^b^b^b=b 竖式说明如下: a=011 (^) b=100 —————— a=111 (a^b的结果,a已变成7) b=011 (b^a的结果,b已变成3) (^) a=111 a=100 (a^b的结果,a变成4) 假设有01111010,想使其低4位翻转,即1变为0,0变为1。可以将它与00001111进行^运算,即:        01111010 (^) 00001111 ——————— 01110101 例如:012^00=012    00001010 (^) 00000000 ——————— 00001010

4.取反运算符(~) 求反运算符~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。 例如~9的运算为:   求反运算符~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。 例如~9的运算为: ~(0000000000001001)结果为:   111111111110110

5.左移运算符(<<)   左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”运算符右边的数指定移动的位数,高位丢弃,低位补0。 例如: a<<4   指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。如图: 00 11 说明:高位左移后溢出,舍弃不起作用。 左移后被溢出舍弃的高位中若不包含1,则左移1位相当于该数乘以2,则左移n位相当于该数乘以2n。

6.右移运算符(>>) 00 11 说明:右移有两种:逻辑右移和算术右移   右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”运算符右边的数指定移动的位数。 例如:设 a=15,则 a>>2 表示把000001111右移为00000011(十进制3)。如图: 00 11 说明:右移有两种:逻辑右移和算术右移 逻辑右移:不论高位是0还是1,右移时高位补0。 算术右移:对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位补1。   右移时是算术右移还是逻辑右移,取决于编译系统的规定。Turbo C和很多系统规定为补1。 注: 右移后若高位中不包含1,则右移1位相当于该数除以2,则右移n位相当于该数除以2n。

例1:取一个整数a从右端开始的4~7位。 分析如下: 先使a右移4位,使要取出的几位移到最右端。即:a>>4 设置一个低4位全为1,其余全为0的数。即:~(~0<<4) 将上面二者进行&运算。即:(a>>4)&~(~0<<4) 程序清单如下: main() {unsigned a,b,c,d; scanf(“%d”,&a); b=a>>4; c=~(~0<<4) d=b&c; printf(“%o,%d\n%o,%d\n”,a,a,d,d); }

例2:循环移位。 例如:将a循环右移n位。如右图: 分析如下: 将a的右端n位先放到b中的高n位中。 c: 右移 分析如下: 将a的右端n位先放到b中的高n位中。 即:b=a<<(16-n); 将a右移n位。 即:c=a>>n; 将c与b按位或运算。 即:c=c|b; 程序清单如右: main() {unsigned a,b,c; int n; scanf(“%d%d”,&a,&n); b=a<<(16-n); c=a>>n; c=c|b; printf(“a=%d\nc=%d\n”,a,c); } 返回

二、位段 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。   所谓“位段”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

1.位段的定义和位域变量的说明: 位段定义与结构体定义相仿,其形式为: struct 位段结构名 { 位段列表 }; 其中位段列表的形式为: 类型说明符 位段名:位段长度 例如: struct bs    { int a:8;    int b:2;    int c:6;    }; 位段变量的说明与结构体变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。

对于位段的定义有以下几点说明: 1)一个位段必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位段时,应从下一单元起存放该位段。也可以有意使某位段从下一单元开始。 例如:struct bs  {unsigned a:4 unsigned :0 /*空域*/ unsigned b:4 /*从下一单元开始存放*/   unsigned c:4   };   在这个位段定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。

从以上分析可以看出,位段在本质上就是一种结构类型,不过其成员是按二进位分配的。 2)由于位段不允许跨两个字节,因此位段的长度不能大于一个字节的长度,也就是说不能超过8位二进位。 3)位段可以无位段名,这时它只用来作填充或调整位置。无名的位段是不能使用的。 例如:struct k {int a:1 int :2 /*该2位不能使用*/ int b:3 int c:2 }; 从以上分析可以看出,位段在本质上就是一种结构类型,不过其成员是按二进位分配的。

2.位段的使用 例3:输出某位段变量的值。 位段的使用和结构体成员的使用相同,其一般形式为: main() 位段变量名·位段名 {struct bs {unsigned a:1; unsigned b:3; unsigned c:4; } bit,*pbit; bit.a=1; bit.b=7; bit.c=15; printf("%d,%d,%d\n",bit.a,bit.b,bit.c); pbit=&bit; pbit->a=0; pbit->b&=3; pbit->c|=1; printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c); } 位段的使用和结构体成员的使用相同,其一般形式为: 位段变量名·位段名 位段允许用各种格式输出。 返回

三、本章小结 1.位运算是C语言的一种特殊运算功能, 它是以二进制位为单位进行运算的。位运算符只有逻辑运算和移位运算两类。位运算符可以与赋值符一起组成复合赋值符。如&=,|=,^=,>>=,<<=等。 2.利用位运算可以完成汇编语言的某些功能,如置位,位清零,移位等。还可进行数据的压缩存储和并行运算。 3.位域在本质上也是结构类型,不过它的成员按二进制位分配内存。其定义、说明及使用的方式都与结构相同。 4.位域提供了一种手段,使得可在高级语言中实现数据的压缩,节省了存储空间,同时也提高了程序的效率。 返回