




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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年度有机冷鲜肉直采直销合作协议
- 二零二五年度房地产企业廉洁项目合作协议
- 2025版智慧城市能源管理系统设计与实施合同
- 二零二五年度房地产项目样板间装修合同
- 2025版文化创意产业投资合作协议
- 2025版房产评估代理服务合同
- 二零二五年度婚姻终止服务协议书
- 2025年硝基呋喃类药项目合作计划书
- 北京师范大学附属第二中学高一分班考试物理试卷及答案
- 胸腹部体格检查
- 眼科常见疾病病人治疗及护理
- DB4401-T 112.2-2021 城市道路占道施工交通组织和安全措施设置+第2部分:交通组织方案编制-(高清现行)
- 癫痫病人的急救与护理课件
- 2022年干部基础理论知识应知必会试题-脱贫攻坚与乡村振兴有效衔接专题100题
- 心律失常患者护理
- Q∕GDW 12158-2021 国家电网有限公司重大活动电力安全保障工作规范
- 防错清单及验证计划
- 全文解读2022新修订的《医疗器械经营监督管理办法》ppt
- 企业负责人施工现场带班检查整改回复表(含附表)GDAQ10305
评论
0/150
提交评论