C语言程序设计_位运算

上传人:zw****58 文档编号:51718221 上传时间:2018-08-16 格式:PPT 页数:22 大小:229.50KB
返回 下载 相关 举报
C语言程序设计_位运算_第1页
第1页 / 共22页
C语言程序设计_位运算_第2页
第2页 / 共22页
C语言程序设计_位运算_第3页
第3页 / 共22页
C语言程序设计_位运算_第4页
第4页 / 共22页
C语言程序设计_位运算_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《C语言程序设计_位运算》由会员分享,可在线阅读,更多相关《C语言程序设计_位运算(22页珍藏版)》请在金锄头文库上搜索。

1、1C语言允许对内存中的字节或字节内的二进制位进行运算,即位运算.12.1 位运算符和位运算位运算符共6 种: a = a b ; b = b a ;a = a b ;printf ( “ %d , %d ” ,a , b ) ; 输出: 4 , 3000000110000000000000100000000000000011100000000aba0000001100000000b0000010000000000a12.1.3 “按位异或”运算符()作用: 对参加运算的两个二进制数按位进行逻辑异或运算.规则: 00 = 0, 10 = 1, 01 = 1, 11 = 0结论: 利用异或运算,不

2、必设置第三个变量就可以实现两个 整型变量值的交换。6用途:某位“异或”1 要变,某位“异或”0 不变。1) 使指定位翻转。比如:要使一个字节的低四位翻转,只需异 或0x0f 。00100011a 00001111a0x0f001011002) 清零。一个整型(含字符型)数据“异或”自身,便清零.00100011aa0000000000100011a712.1.4 “按位取反” 运算符() 作用: 对一个二进制数按位取反,是一个单目运算符. 如: a = 15 则 a = 65520 00000000 0000111111111111 11110000a a注意: 和! 运算符是两个完全不同的运

3、算符。 的优先级与+ +, , !相同,且结合性都是从右至左。 例如:main ( ) int a = 0 , b = 1 ;printf ( “ %d , %d n”, a ,b ) ; printf ( “ %d , %d n”, !a , !b ) ; 运行结果: 1, 21, 0 000000000000000011111111111111110 08应用举例: 若有一个整数a ,想使它最低一位为0(即屏蔽 d0位),而其它位不变。请问如何操作?方法是: a=a 请问可用 a=a 吗? 答:对于以16位存放一个整型数据的计算机系统,后者也是 可以的。但对于以32位(或更多位)存放一个整

4、型数据的系 统(如VAX 11/780),后者是不可以的。因此,后者的可移植 性很差;而前者则适合于任何系统,程序的可移植性好!00001011000000001111111011111111a 0xfffe0000101100000000111111101111111100000010000000000000000000000000a 0xfffe11111110111111111111111111111111116位整型32位整型912.1.5 左移位运算 ()作用: 将操作数的各个二进位顺序右移.左端空出的位补0 或补1, 而移出右端的位则被舍去.如: an 表示将a 的各个二进位顺序右

5、移n 位.说明: 右移运算的结果与操作数的符号有关. 就Turbo C2.0而言: 1) 无符号数为“逻辑右移”,即左端空出位一律补0 .2) 有符号数为“算术右移”,即正数右移,空位补0 ,负数右移 ,空位补1 .一句话,算术右移是指最高位移入符号位。其它系统对有符号数可能依然采用“逻辑右移”,这随系统而定.0000000010000000 0000000001000000 0000000011000000aa 1 a 1逻辑右移,结果为 16384算术右移,结果为 16384算术右移运算相当于除2 运算。 右移 1 位,相当于除以2 。 右移n 位,则除以2n 。例如: a = 32768

6、1212.1.7 位运算符的优先级与结合性 c = ( 0 m; c = ( 0 n 00011011 11110101c01111011 11110101c16main ( ) unsignde a , b , c ; int n ;scanf ( “ %o , %d ” , b = a n ; c = c | b ;printf ( “ %o n %o n” , a , c ) ; 如输入: 157653 , 3 输出为: 15765375765同样的方法,可以实现循环左移。11011111 1010101101111011 11110101ac1712.3 位 段以前,我们内存的存取都是

7、以字节为单位,即信息存储至 少要占用一个字节。实际上,有时存储一个信息不必占用一个 或多个字节,而只需占用1位或几位便可。这在计算机过程控 制和数据通信领域经常会遇到。C语言提供对这方面的处理, 而且可用以下两种方法实现:1、通过位运算实现对1位或几位的操作:比如我们可以人为 地将一个字节data划分为几项,假如是四项a、b、c、d, 且它们分别占1位、3位、2位、2位(如下图所示)。如果 欲将b的值变为6,则可以这样:dataabcd7018(1)将b项(4 6位)清零data = data 或者 data = data (3)将data与“64”进行按位或运算,即可实现将b的值变为6 。1

8、000111170(2)将数6左移4位,使110成为4 - 6位0110000070x000xxxxx110xxxxdatadata|(64 )(74 )说明:其中(1)步中的0x8f,称为“屏蔽字”,即把data中b的 信息屏蔽掉,而其它信息不受影响。192、通过位段来实现对1位或几位的操作:C语言允许在一个结构体中 以位为单位来指定其成员所占内存的长度,这种以位为单位的成 员称为“位段”(或“位域”bit field)。例如: Struct packed_data unsigned a:2;unsigned b:6;unsigned c:4;unsigned d:4;int i; data

9、;Struct packed_data unsigned a:2;unsigned b:3;unsigned c:4;int i; ; Struct packed_data data;abcd i164462abc空闲i1674327015233120关于位段的定义和引用的说明: 1)位段成员的类型必须指定为unsigned int型。 2)若某一位段要从另一存储单元(字)单独开始存放,应这样定义: Struct packed_data unsigned a:1;unsigned b:2;unsigned :0;unsigned c:3; /* 在Turbo C中表示c从第3个字节开始存放 *

10、/ ; 3)可以定义无名字段,如:Struct packed_data unsigned a:1;unsigned :2; /* 表示这两位空间不用 */unsigned b:3;unsigned c:4; ;214) 一个位段必须存储在同一存储单元(字)中,不能跨越两个单 元。如果第一个字不能容纳下一个位段,则该空间不用,而 从下一个字开始存放。比如: Struct packed_data unsigned a:5;unsigned b:6;unsigned c:6;int i; ; Struct packed_data data;i空闲d空闲ba166565注意:上面定义的结构体共占6个字节(3个字)。15010015225) 位段的长度不能大于存储单元(字)的长度,也不能定义 位段数组。6) 位段可以用整型格式符(%d,%u,%o,%x)进行输出。如:printf(“%d,%d,%d”,data.a,data.b,data.c);7) 位段可以在数值表达式中引用,它会被系统自动地转换成 整型数据来处理。如:data.a + 5/data.b 是合法的。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 教育学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号