位运算推选优秀ppt_第1页
位运算推选优秀ppt_第2页
位运算推选优秀ppt_第3页
位运算推选优秀ppt_第4页
位运算推选优秀ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

第八章位运算(yùnsuàn)第一页,共25页。8.1位运算(yùnsuàn)

8.2位段第八章位运算(yùnsuàn)第二页,共25页。一个(yīɡè)数与0进行异或运算,保留原值。pdata->b&=3;/*与运算*/printf("decimal\t\tshiftleftby\tresult\n");按位异或运算有如下3个特殊用途:左移运算符“<<”双目运算符,其功能是将运算数据中的每个二进制位向左移动若干位,从左边移出去的高位部分被丢弃,右边空出的低位部分补零。structpacked_datapdata=&data;/*指针(zhǐzhēn)pdata指向data的首地址*/【实例(shílì)54两个数的位运算】structnumdata1位运算(yùnsuàn)第二十一页,共25页。【实例53两个数的几种(jǐzhǒnɡ)位运算】【相关(xiāngguān)知识】第二十二页,共25页。【相关(xiāngguān)知识】有的计算机系统补1,称为算术右移。8.1位运算(yùnsuàn)

【学习目标】掌握几种常用运算符及表达式的用法

理解(lǐjiě)位运算的实际应用

能进行简单的位运算

第三页,共25页。位运算(yùnsuàn)

【实例53两个数的几种(jǐzhǒnɡ)位运算】

设a=255,b=10,对两个数a和b进行(jìnxíng)位运算并输出结果。程序的运行结果下图所示。第四页,共25页。8.1位运算(yùnsuàn)

【程序代码】

#include"stdio.h"main(){inta=255,b=10,i; /*定义3个整型变量*/printf("The%d&%dis%d\n",a,b,a&b);/*计算两个数的与运算(yùnsuàn)*/printf("The%d|%dis%d\n",a,b,a|b);/*计算两个数的或运算(yùnsuàn)*/printf("The%d^%dis%d\n",a,b,a^b);/*计算两个数的异或运算(yùnsuàn)*/printf("The~%dis%d\n",a,~a);/*计算a进行取反运算(yùnsuàn)的值*/printf("decimal\t\tshiftleftby\tresult\n");for(i=1;i<9;i++){b=a<<i; /*使a左移i位*/printf("%d\t\t%d\t\t%d\n",a,i,b);/*输出当前左移结果*/} printf("decimal\t\tshiftrightby\tresult\n");for(i=1;i<9;i++){b=a>>i; /*使a右移i位*/printf("%d\t\t%d\t\t%d\n",a,i,b);}/*输出当前右移结果*/getch();}第五页,共25页。8.1位运算(yùnsuàn)

【相关(xiāngguān)知识】位运算是指进行(jìnxíng)二进制位的运算。它的运算对象不是以字节为单位,而是对内存中存储数据的二进制位进行(jìnxíng)运算。每一个二进制位的值是0或1。一个字节由8个二进制位组成,其中最右边的一位称为“最低位”或“最低有效位”,即第0位,向左是第1位,第2位,依此类推,最左边的一位是“最高位”或“最高有效位”。参与位运算的运算数据只能是整型数据或字符型数据,不能是实型等其他类型数据。语言提供了6中位运算符。其中除了运算符“~”是单目运算符之外,其他的都是双目运算符。位运算符含义例子运算功能&按位与a&ba和b按位与|按位或A|ba和b按位或^按位异或A^ba和b按位异或~按位取反~aa按位取反<<左移A<<2a左移2位>>右移A>>2a右移2位第六页,共25页。8.1位运算(yùnsuàn)

【相关(xiāngguān)知识】按位与运算符(&)按位与运算符“&”是双目运算符,其功能是对两个运算数据的对应二进制位进行与运算。参与运算的数据以二进制补码方式出现,其运算规则是只有对应的两个二进制位均为1时,结果位才为1;否则为0。即: 0&0=0;0&1=0;1&0=0;1&1=1;按位与运算规则可知,一个数的某二进制位与0相与,结果为0;与1相与,结果保留原值。位与运算有如下两个特殊用途:清零:如果想将一个数a的某些位置(wèizhi)0,即其全部的二进制位均为0,只需找另一个数b,其相应位为0,然后与a进行按位与运算即可。获取或保留一个数中的特定位:如果想获取数a的某些位或将数a的某些位保留,就与一个数b进行与运算,数b在该位取1。第七页,共25页。8.1位运算(yùnsuàn)

【相关(xiāngguān)知识】按位或运算符(|)按位或运算符“|”是双目运算符,其功能是对两个运算数据的对应二进制位进行或运算。其运算规则是只有对应的两个二进制位均为0时,结果位才为0;否则为1。即: 0|0=0;0|1=1;1|0=1;1|1=1;按位或运算规则可知,一个(yīɡè)数的某二进制位与1相或,结果为1;与0相或,结果保留原值。据此,位或运算有如下特殊用途,将一个(yīɡè)数的某些特定位置1。第八页,共25页。8.1位运算(yùnsuàn)

【相关(xiāngguān)知识】按位异或运算符(^)按位异或运算符“^”是双目运算符,其功能是对两个运算数据的对应二进制位进行异或运算。其运算规则是对应的两个二进制位的值不同时,结果位才为1;否则为0。即: 0|0=0;0|1=1;1|0=1;1|1=0; 参与运算的数据以二进制补码方式出现。按位异或运算规则可知,一个(yīɡè)数的某二进制位与1相或,可使1变0,0变1;与0相异或,结果保留原值。按位异或运算有如下3个特殊用途:保留原值。一个(yīɡè)数与0进行异或运算,保留原值。使特定位翻转。就是使将特定位中的1变为0,0变为1。交换两个变量的值,而不借助于临时变量。第九页,共25页。8.1位运算(yùnsuàn)

【相关(xiāngguān)知识】按位取反运算符(~)按位取反运算符“~”为单目运算符,其功能是把运算数据(shùjù)按二进制位取反。其运算规则是操作数的某位二进制位为1,则取反为0;反之,当它为0时,则取反为1。例如~9是对十进制数9(00001001)按位取反,其运算为:~(00001001),结果为:11110110。第十页,共25页。8.1位运算(yùnsuàn)

【相关(xiāngguān)知识】按位左移运算符(<<)左移运算符“<<”双目运算符,其功能是将运算数据中的每个二进制位向左移动若干位,从左边移出去的高位部分被丢弃,右边空出的低位部分补零。例如,a=a<<2,将a的二进制数左移2位,右补0。若a=5,即二进制数00000101,左移2位得00010100,即十进制数20。由此可见,左移运算相当于乘法运算,左移1位相当于该数乘以2,左移n位相当于该数乘以2n,但该结论(jiélùn)只适用于该数左移时被溢出舍弃的高位中不包含1的情况。第十一页,共25页。8.1位运算(yùnsuàn)

【相关(xiāngguān)知识】按位右移运算符(>>)右移运算符“>>”双目运算符,其功能是将运算数据中的每个二进制位向右移动若干位,从右边移出的低位部分被丢弃。对于无符号数,左边空出的高位部分补0。对于有符号数,如果符号位为0(即为正数(zhèngshù)),则空出的高位部分补0;如果符号位为1(即为负数),空出的高位部分补0还是补1,与使用的计算机系统有关,有的计算机系统补0,称为逻辑右移;有的计算机系统补1,称为算术右移。例如,设a=15,则a>>2表示把00001111右移为00000011,结果为a=3。第十二页,共25页。8.1位运算(yùnsuàn)

【相关(xiāngguān)知识】位运算的复合(fùhé)赋值运算符位运算复合(fùhé)赋值运算符的运算规则是:首先进行两个操作数的位运算,然后再将结果赋值给左操作数。位复合运算符含义例子等价于&=按位与赋值a&=ba=a&b|=按位或赋值a|=ba=a|b^=按位异或赋值a^=ba=a^b<<=左移赋值a<<=2a=a<<2>>=右移赋值a>>=2a=a>>2第十三页,共25页。按位异或运算有如下3个特殊用途:定无名位(míngwèi)段,由于位段不允许跨两个字节,因此位段的长度不能大于一个字节的长度,也就是说,逗号不能超过8位二进制位。pdata->b&=3;/*与运算*/在存储单元中位段的空间分配方向因机器而异。获取或保留一个数中的特定位:如果想获取数a的某些位或将数a的某些位保留,就与一个数b进行与运算,数b在该位取1。其运算规则是只有对应的两个二进制位均为0时,结果位才为0;【相关(xiāngguān)知识】例如~9是对十进制数9(00001001)按位取反,其运算为:~(00001001),结果为:11110110。按位与运算规则可知,一个数的某二进制位与0相与,结果为0;structpacked_data【相关(xiāngguān)知识】8.2位段

【学习(xuéxí)目标】

了解位段的应用

第十四页,共25页。8.2位段

【实例(shílì)54两个数的位运算】通过位段,实现对两个数进行位运算(yùnsuàn)。程序运行结果下图所示。第十五页,共25页。8.2位段

【程序代码】#include"stdio.h"main(){structpacked_data{unsigneda:2; /*a为位段名,占2位二进制位*/unsignedb:4; /*b为位段名,占4位二进制位*/unsignedc:5; /*c为位段名,占5位二进制位*/}data,*pdata;/*data为位段变量,*pdata为位段指针(zhǐzhēn)变量*/data.a=3; /*将3赋给位段变量data中的位段成员a*/data.b=12; /*将12赋给位段变量data中的位段成员b*/data.c=125;/*将125赋给位段变量data中的位段成员c*/printf("data.a=%d,data.b=%d,data.c=%d\n",data.a,data.b,data.c);pdata=&data;/*指针(zhǐzhēn)pdata指向data的首地址*/pdata->a=2;pdata->b&=3;/*与运算*/pdata->c|=5;/*或运算*/printf("pdata->a=%d,pdata->b=%d,pdata->c=%d\n",pdata->a,pdata->b,pdata->c);getch();}第十六页,共25页。8.2位段

【相关(xiāngguān)知识】位段简介所谓“位段”是指把一个字节中的二进制位划分为几个不同的区段,并说明每个区段的位数。每个区段有一个段名,允许在程序(chéngxù)中按段名进行操作,这样就可以把几个不同的对象用一个字节中的几个位段来表示。第十七页,共25页。8.2位段

【相关(xiāngguān)知识】2.位段的定义和位段变量的说明在一个位段的定义是通过结构体类型定义来实现的,其一般格式如下(rúxià)。struct位段结构名{类型说明符位段名:位段长度};把一个unsigned整型数据单元分成若干段,定义形式如下(rúxià):structdt{ unsigneda:6; /*a为位段名,占6位长度*/ unsignedb:2; /*b为位段名,占2位长度*/ unsignedc:4; /*c为位段名,占4位长度*/ unsignedd:4; /*d为位段名,占4位长度*/};主函数最后添加语句“system("pause");”第十八页,共25页。8.2位段

【相关(xiāngguān)知识】3.位段的定义说明一个位段必须存储在同一个存储单元(cúnchǔdānyuán)中,不能跨两个单元。如果第一个存储单元(cúnchǔdānyuán)所剩空间不够存放另一个位段时,则该空间不用,而以下一个单元起存放该位段。例如: structnumdata { unsigneda:10; unsignedb:5; unsignedc:8; };第十九页,共25页。8.2位段

【相关(xiāngguān)知识】3.位段的定义说明有意使某一个位段从下一个存储单元开始存放。可以用如下的定义形式(xíngshì): structnumdata { unsigneda:2; unsignedb:4; unsigned0; /*空位段表示该位段不使用*/ unsignedc:5; /*另一个单元存储*/ };本来a、b、c是应该连续存放在一个存储单元中,但由于中间有一个长度为0的位段,其作用是使下一个位段从下一个存储单元开始存放。因此,只能将a和b存储在一个存储单元,而将c存储在下一个存储单元。第二十页,共25页。8.2位段

【相关(xiāngguān)知识】3.位段的定义说明定义无名位段,这时它只用来填充或调整位置,无名位段的空间是不能用的。例如: structnumdata { unsigneda:1; unsigned:2; /*无名位段所占的两个空间空闲不用*/ unsignedb:3; unsignedc:4; };此位段结构定义中的第二个位段成员是无名位段,它占用的两个二进制位,在a和b位段之间起分隔(fēngé)作用,无名

温馨提示

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

评论

0/150

提交评论