




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十章第十章 位运算位运算 内容提要:内容提要:位逻辑运算位逻辑运算移位运算移位运算复合位运算复合位运算位段位段 位逻辑运算位逻辑运算 移位运算移位运算 复合位运算复合位运算 位段位段位运算是指对操作数以二进制位(位运算是指对操作数以二进制位(bitbit)为为单位进行数据加工。单位进行数据加工。C C语言的位运算功能有:语言的位运算功能有: 位逻辑运算(四种);位逻辑运算(四种); 位移操作(两种)。位移操作(两种)。参加位操作的操作数必须是整型常量或变量。参加位操作的操作数必须是整型常量或变量。一、位逻辑运算一、位逻辑运算:位位 逻逻 辑辑 运运 算算 种种 类类运算符运算符名名称称例例子
2、子功功能能 位反位反 b b求求b b的位反的位反& &位与位与b & cb & c求求b b和和c c的位与的位与| |位或位或b | cb | c求求b b和和c c的位或的位或 位异或位异或b cb c求求b b和和c c的位异或的位异或运算符运算符名名称称例例子子功功能能 位反位反 b b求求b b的位反的位反& &位与位与b & cb & c求求b b和和c c的位与的位与| |位或位或b | cb | c求求b b和和c c的位或的位或 位异或位异或b cb c求求b b和和c c的位异或的位异或运算符运算符运算符运算符名名称称名名称称例例子子例例子子功功能能功功能能 位反位反位反
3、位反 b b b b求求b b的位反的位反求求b b的位反的位反& & & &位与位与位与位与b & cb & cb & cb & c求求b b和和c c的位与的位与求求b b和和c c的位与的位与| | | |位或位或位或位或b | cb | cb | cb | c求求b b和和c c的位或的位或求求b b和和c c的位或的位或 位异或位异或位异或位异或b cb cb cb c求求b b和和c c的位异或的位异或求求b b和和c c的位异或的位异或1位反运算位反运算位反运算是单项运算,它是把一个操作数按位反运算是单项运算,它是把一个操作数按位求反,即操作数的各个二进制位为位求反,即操作数的各
4、个二进制位为1 1时变换时变换为为0 0,为,为0 0时变换成时变换成1 1。例例10-110-1:将变量:将变量a a按位求反赋予变量按位求反赋予变量b b。 void mainvoid main三三 unsigned char a, b; unsigned char a, b; a=0 x9a; b=a; a=0 x9a; b=a; printf(a:0 x%x b:0 x%xn,a,b); printf(a:0 x%x b:0 x%xn,a,b); void main()void main()unsigned char a, b;unsigned char a, b;a=0 x9a; b
5、=a;a=0 x9a; b=a;printf(a:0 x%x b:0 x%xprintf(a:0 x%x b:0 x%x n,a,b);n,a,b); 10011010a1001101010011010a运行结果:运行结果:a:0 x9a b:0 x65a:0 x9a b:0 x6501100101bb=a0110010101100101bb=a2位与、位或和位异或是对两个操作数的对位与、位或和位异或是对两个操作数的对应二进制位进行运算。应二进制位进行运算。a a位位b b位位a &b a &b 位与位与a|b a|b 位或位或ab ab 位异或位异或1 11 10 00 01 10 01 1
6、0 01 10 00 00 01 11 11 10 00 01 11 10 0a a位位b b位位a &b a &b 位与位与a|b a|b 位或位或ab ab 位异或位异或1 11 10 00 01 10 01 10 01 10 00 00 01 11 11 10 00 01 11 10 0a a位位a a位位b b位位b b位位a &b a &b 位与位与a &b a &b 位与位与a|b a|b 位或位或a|b a|b 位或位或ab ab 位异或位异或ab ab 位异或位异或1 11 10 00 01 11 10 00 01 10 01 10 01 10 01 10 01 10 00 0
7、0 01 10 00 00 01 11 11 10 01 11 11 10 00 01 11 10 00 01 11 10 0位位 逻逻 辑辑 运运 算算 种种 类类例例10-2:位逻辑运算。:位逻辑运算。void main()void main()unsigned char a, b;unsigned char a, b;a=0 xb9;a=0 xb9;b=0 x83;b=0 x83;printf(a and b:0 x%xprintf(a and b:0 x%x n,a&b);n,a&b);printf(a and b:0 x%xprintf(a and b:0 x%x n,a|b);n,
8、a|b);printf(a and b:0 x%xprintf(a and b:0 x%x n,ab);n,ab); 运行结果:运行结果: a and b:0 x81a and b:0 x81 a and b:0 xbba and b:0 xbb a and b:0 x3aa and b:0 x3a 10111001a:0 xb910000011b:0 x83a&b10000001结果结果:0 x811011100110111001a:0 xb91000001110000011b:0 x83a&b1000000110000001结果结果:0 x8110111001a:0 xb910000011
9、b:0 x83a|b10111011结果结果:0 xbb1011100110111001a:0 xb91000001110000011b:0 x83a|b1011101110111011结果结果:0 xbb0011101000111010结果结果:0 x3a1011100110111001a:0 xb91000001110000011b:0 x83ab注意:注意: 对一个操作数的位运算并不改变操作对一个操作数的位运算并不改变操作数本身的数值。数本身的数值。 二、移位操作二、移位操作移位操作是对操作数以二进制位(移位操作是对操作数以二进制位(bitbit)为为单位进行左移或右移。它们是双目运算符
10、。单位进行左移或右移。它们是双目运算符。形式:形式:操作数移位运算符移动的操作数移位运算符移动的位位数数运运算算种种类类运算符运算符名称名称例子例子运算功能运算功能右移位右移位b3b3b b右移右移3 3位位左移位左移位c2c右移位右移位b3b3b b右移右移3 3位位左移位左移位c2c右移位右移位右移位右移位b3b3b3b3b b右移右移3 3位位b b右移右移3 3位位左移位左移位左移位左移位c2c2c2c2b b左移左移2 2位位b b左移左移2 2位位例例10-3:左移位操作。:左移位操作。void main()void main()unsigned char a, b;unsigne
11、d char a, b;a=0 x1b; a=0 x1b; b=a2;b=a2;printf(0 x%x left_shift 2 bit:0 x%xprintf(0 x%x left_shift 2 bit:0 x%x n,a,b);n,a,b); 运行结果:运行结果:0 0 x1b left_shift 2 bit:0 x6cx1b left_shift 2 bit:0 x6c00011011a:0 x1b01101100b:0 x6c舍弃舍弃补零补零b=a20001101100011011a:0 x1b0110110001101100b:0 x6c舍弃舍弃补零补零b=a2说明:说明:1)
12、 左移位操作中,操作数移位后,右端出现左移位操作中,操作数移位后,右端出现的空格补的空格补0,而移至左端之外的位舍去,不,而移至左端之外的位舍去,不管其是否为符号位。管其是否为符号位。00011011a:0 x1b01101100b:0 x6c舍弃舍弃补零补零b=a20001101100011011a:0 x1b0110110001101100b:0 x6c舍弃舍弃补零补零b=a2说明:说明:2) 每向左移一位,相当于该数乘每向左移一位,相当于该数乘2。3)3) 右移位操作与操作数的数据类型是否带有右移位操作与操作数的数据类型是否带有符号有关:符号有关:00011011a:0 x1b01101
13、100b:0 x6c舍弃舍弃补零补零b=a20001101100011011a:0 x1b0110110001101100b:0 x6c舍弃舍弃补零补零b=a2 不带符号的操作数右移位时,左端出现的空不带符号的操作数右移位时,左端出现的空位补零。位补零。 带符号的操作数右移位时,左端出现的空位带符号的操作数右移位时,左端出现的空位按原最左端的位复制,无论什么操作数,移按原最左端的位复制,无论什么操作数,移出右端的位被舍弃。出右端的位被舍弃。00011011a:0 x1b01101100b:0 x6c舍弃舍弃补零补零b=a20001101100011011a:0 x1b0110110001101
14、100b:0 x6c舍弃舍弃补零补零b=a2 );printf(unsigned b right_shift 2 bit:%dn, b2 );运行结果:运行结果:signed a right_shift 2 bit:-2signed a right_shift 2 bit:-2unsigned b right_shift 2 bit:62unsigned b right_shift 2 bit:62char a=-8;负数补码存储负数补码存储11111000111110001111111011111110舍弃舍弃复制复制a2 带符号的操作数右移位时,左端出现的空位带符号的操作数右移位时,左端出
15、现的空位按原最左端的符号位复制,无论什么操作数,按原最左端的符号位复制,无论什么操作数,移出右端的位被舍弃。移出右端的位被舍弃。不带符号的操作数右移位时,左端出现的空不带符号的操作数右移位时,左端出现的空位补零。位补零。unsigned char b=24811111000111110000011111000111110舍弃舍弃补零补零b2unsigned char b=24811111000111110000011111000111110舍弃舍弃补零补零b2说明:说明:4) 每右移一位相当于操作数除每右移一位相当于操作数除2。5) a2,b2形式形式的的操作并操作并不不改变操作数改变操作数a
16、,b的值;若的值;若a= a2, b= b2则不同。则不同。三、位操作赋值运算(复合位运算)三、位操作赋值运算(复合位运算)运算符运算符名名称称例例子子等价于等价于&=&=位与赋值位与赋值a&=ba&=ba=a&ba=a&b|=|=位或赋值位或赋值a|=ba|=ba=a|ba=a|b=位异或赋值位异或赋值a=ba=ba=aba=ab=右移赋值右移赋值a=ba=ba=aba=ab=左移赋值左移赋值a=ba=ba=aba=a=右移赋值右移赋值a=ba=ba=aba=ab=左移赋值左移赋值a=ba=ba=aba=a=右移赋值右移赋值右移赋值右移赋值a=ba=ba=ba=ba=aba=aba=aba=
17、ab=左移赋值左移赋值左移赋值左移赋值a=ba=ba=ba=ba=aba=aba=aba=a n1; c = ( 0 n1b=value n10 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 00 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 0001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 40 41 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 01 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
18、0c=(0 4 )c=(0 4 )0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1b b 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 00 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 0c c 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1d=b&cd=b&c0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 00 0
19、0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0四、位段四、位段就是以位(就是以位(bitbit)位单位定义长度的结构体类型成员。位单位定义长度的结构体类型成员。说明:说明:1)1) 具体使用中应注意成员的所占位,即长度,及其由具体使用中应注意成员的所占位,即长度,及其由长度限定的存取值域。长度限定的存取值域。2)2) 一个位段必须分配在同一个存储单元之中,不能跨一个位段必须分配在同一个存储单元之中,不能跨两个单元,可以两个单元,可以unsigned:0 unsigned:0 实现从下以个存储单实现从下以个存储单元开始存放。元开始存放。3)3) 位段可在数值表达式中引用,并由系统自动转换为位段可在数值表达式中引用,并由系统自动转换为整形数,可用整形噶式输出。整形数,可用整形噶式输出。例例1-6:位段运算。:位段运算。void main()void main()struct packed_datestruct packed_dateunsigned a:2;unsigned a:2;/结构成员位段结构成员位段a a所占位所占位2 2unsigned b:6;unsigned b:6;/结构成员位段结构成员位段b b所占位所占
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年执业药师考试技术要点试题及答案
- 自考行政管理考试大纲试题及答案
- 经济法概论考试复习试题及答案
- 行政管理专业经典语文试题及答案
- 大学语文考试能力发展试题及答案
- 自考行政管理的课程实践试题及答案
- 2025年执业医师考试重要通知解析试题及答案
- 大学语文思维训练试题及答案
- 护理职业发展规划执业护士考试试题及答案
- 会考语文试题及答案分享
- 中医文化主题班会
- DZ∕T 0148-2014 水文水井地质钻探规程(正式版)
- 《百分数的认识》省公开课金奖全国赛课一等奖微课获奖课件
- 第三单元 文明与家园 大单元教学设计-2023-2024学年部编版道德与法治九年级上册
- 超氧化物歧化酶课件
- 第四章-国防动员
- 设备管理培训课件-设备管理的战略规划
- 学术报告计算机
- 智能扫地机器人计划书
- 行政强制法知识讲座
- 医学社会学与医患关系教学设计
评论
0/150
提交评论