《(精品)c语言电子教案12.ppt》由会员分享,可在线阅读,更多相关《(精品)c语言电子教案12.ppt(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、UNIX C编程编程yyyy-M-1age *第第12章章 位运算位运算知识点:知识点:各种位运算符和位运算各种位运算符和位运算 位段位段重点:重点:各种位运算各种位运算 利用位运算获得特定数据利用位运算获得特定数据难点:难点:s位段的使用位段的使用UNIX C编程编程yyyy-M-2age *q 计算机中的数据是以二进制计算机中的数据是以二进制0、1存储的存储的q 每个每个0或或1称为一个称为一个“位位”(bit)q C语言中提供了对二进制位语言中提供了对二进制位(bit)的直接操作的直接操作第第12章章 位运算位运算UNIX C编程编程yyyy-M-3age *q 位运算符位运算符12.1
2、位运算符和位运算位运算符和位运算运算符运算符含义含义运算对象个数运算对象个数优先级优先级 结合方向结合方向按位按位“取反取反”单目单目右右左左&按位按位“与与”双目双目左左右右按位按位“异或异或”双目双目|按位按位“或或”双目双目右移右移双目双目=,=UNIX C编程编程yyyy-M-4age *“按位与按位与”运算符运算符(&)(&)12.112.1位运算符和位运算位运算符和位运算aba&b000010100111unsigned int a=061,b=017;printf(a&b=%o,a&b);0000000000110001&00000000000011110000000000000
3、001 a&b=01UNIX C编程编程yyyy-M-5age *12.112.1位运算符和位运算位运算符和位运算“按位或按位或”运算符运算符(|)aba|b000011101111unsigned int a=061,b=017;printf(a|b=%o,a|b);0000000000110001|00000000000011110000000000111111 a|b=077UNIX C编程编程yyyy-M-6age *12.1位运算符和位运算位运算符和位运算q“按位异或按位异或”运算符运算符()abab000011101110unsigned int a=061,b=017;print
4、f(ab=%o,ab);0000000000110001 00000000000011110000000000111110 ab=076UNIX C编程编程yyyy-M-7age *12.1位运算符和位运算位运算符和位运算q“按位取反按位取反”运算符运算符()运算符优先级别为运算符优先级别为2aa0110unsigned int a=061;printf(a=%o,a);00000000001100011111111111001110 a=0177716UNIX C编程编程yyyy-M-8age *12.1位运算符和位运算位运算符和位运算q“左移左移”运算符运算符()v 表达式表达式1表达式表
5、达式2v 表达式表达式1为移位的对象,表达式为移位的对象,表达式2为移位的位数为移位的位数v 左移后,右边的空位补左移后,右边的空位补0,高位左移后溢出,高位左移后溢出v 左移一位相当于将操作数乘以左移一位相当于将操作数乘以2int a=64;printf(a=%d,a2);溢出溢出20 0 0 0 0 0 0 0 0 1 0 0 0 0 0 00 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 a)v 表达式表达式1表达式表达式2v 表达式表达式1为移位的对象,表达式为移位的对象,表达式2为移位的位数为移位的位数v 对于无符号数,右移后,左边的空位补对于无符号数,右移后,左边的空
6、位补“0”v 对于带符号数对于带符号数 若符号位为若符号位为0,右移后,左边的空位补,右移后,左边的空位补“0”若符号位为若符号位为1,右移后,左边的空位补,右移后,左边的空位补“0”或补或补“1”随计算机系统不同随计算机系统不同 逻辑右移逻辑右移:补补“0”算术右移算术右移:补补“1”Turbo C采用算术右移采用算术右移UNIX C编程编程yyyy-M-10age *12.1位运算符和位运算位运算符和位运算int a=-8;printf(a=%d,a2);2溢出溢出1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 01 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
7、a2=-21 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0原码原码1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0补码补码UNIX C编程编程yyyy-M-11age *q 不同长度的数据进行位运算不同长度的数据进行位运算v long a;int b;计算计算a&bv 系统会将二者按右端对齐系统会将二者按右端对齐 若若b为正数为正数,则左侧则左侧16位补满位补满0 若若b为负数为负数,左端应补满左端应补满1 若若b为无符号整数型为无符号整数型,则左侧添满则左侧添满0。12.1位运算符和位运算位运算符和位运算UNIX C编程编程yyyy-M-12age *q 例例 取
8、一个整数取一个整数a从右端开始的从右端开始的47位。位。12.2位运算举例位运算举例a1587430bxxxx15b=a487430000000000000000001587430111111111111111115(0)87430111111111111000015(0)487430c000000000000111115c=(0)4)87430d00000000000015d=b&c87430UNIX C编程编程yyyy-M-13age *12.2位运算举例位运算举例q 例例 将一个无符号整数将一个无符号整数a循环右移循环右移n位。位。a#%?$&1587430c?$%1587430b?
9、$&00000000000015b=an87430c=c|bUNIX C编程编程yyyy-M-14age *q 例例 从一个从一个16位无符号位无符号a中取出从左端第中取出从左端第5到第到第8位的数。位的数。12.2位运算举例位运算举例a1587430c111111110000000015c=z(5-1)87430z111111111111111115z=(0)87430z=b&c;z000011110000000015z=b&c87430z=z&a;z00000000000015z=z&a87430z=z(16-8);z00000000000015z=z(16-8)87430UNIX C编程
10、编程yyyy-M-15age *q C语言允许在一个结构体中以位为单位来指定其成员所占语言允许在一个结构体中以位为单位来指定其成员所占内存的长度,称为位段(内存的长度,称为位段(bit field)例:例:structpacked_data unsigneda:2;unsignedb:6;unsignedc:4;unsignedd:4;inti;data;其中其中a、b、c、d分别占分别占2位、位、6位、位、4位、位、4位。位。i为整型。共为整型。共占占4个字节。个字节。12.3位段位段UNIX C编程编程yyyy-M-16age *q 说明说明v 位段成员的类型只能为位段成员的类型只能为unsigned 或或intv 位段可当做整型变量使用,但要注意位段表示数值的位段可当做整型变量使用,但要注意位段表示数值的范围,如两位二进制的范围为范围,如两位二进制的范围为03,三位二进制的范围为,三位二进制的范围为07v 不能定义位段数组不能定义位段数组v 位段可按整型量的形式加参运算或赋值、输出位段可按整型量的形式加参运算或赋值、输出12.3位段位段