第11章 C语言的最小数据单位——位

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

19
4
11.1.2 原码




原码表示是机器数的一种简单的表示法。其符号位用0表示正号, 用1表示负号,数值用二进制形式表示。设有一数为X,则原码表 示可记作(X)原。例如: (11)原=00001011 (-11)原=10001011 原码表示数的范围与二进制位数有关。当用8位二进制来表示整 数原码时,其表示范围: 最大值为01111111,其真值为(127)10。最小值为11111111, 其真值为(-127)10。对0有两种表示形式: (+0)原=00000000 (-0)原=10000000 +0和-0代表的都是0,但表示方法却有两种。
15
11.4 位段

11.4.1 位段基础知识 11.4.2 位段的引用
16
11.4.1 位段基础知识




所谓“位段”,又称为“位域”或“位字段”,是把一个字节中 的二进制位划分为几个不同的区域,并说明每个区域的位数。每 个域有一个域名,允许在程序中按域名进行操作。这样就可以把 几个不同的对象用一个字节的二进制位域来表示。 位段是一种特殊形式的结构体类型中的成员,它和前面介绍的结 构体类型的不同之处是以位为单位来定义结构体成员的长度。 位段定义与结构体定义相仿,其形式为: struct 位段结构名 { 位域列表 }; 其中位域列表的形式为: 类型说明符 位域名:位域长度;
14
11.3 位运算实例


【例11-6】基本思路:由上节的学习可知,如果想保留一个数的 某些位,就让这个数和一个新数做与运算,原数中想保留的位在 新数中相应的位为“1”、其他位在新数中相应的位为“0”。 【例11-7】基本思路:构造一个新数,最高位“1”,剩下所有位 为“0”。因为要从高到低输出正整数的各二进制位,也就是要保 留当前数的最高一位。每次将当前的最高位取出(保留),并输 出后再将该数左移1位,然后将当前按最高位保留输出后,将该 数左移1位……,直到所有位输出为止。
按位与运算符“&”有以下应用: (1)清0 (2)保留某些位 (3)取某个数中某些指定位

9
11.2.2 按位或运算符

按位或运算符“|”是双目运算符。其功能是参与运算的两数各对 应的二进制位相或。只要对应的二个二进制位有一个为1时,结 果位就为1,否则为零。参与运算的两个数均以补码出现。即: 0|0=0 0|1=1 1|0=1 1|1=1 【例11-2】本实例演示了求9|5。

按位取反运算符“~”是单目运算符,具有右结合性。其功能是对 参与运算数的各个位按位求反,即0变为1,1变为0。如~9的运 算为:
~(00001001)结果为:11110110。
12
11.2.5 左移运算符


左移运算符“<<”是双目运算符。其功能把“<<”左边运算数的 各二进制位全部左移若干位,由“<<”右边的数指定移动的位数, 高位丢弃,低位补0。 对于机器操作中,左移一位就相当于该数乘以2,左移n位就相当 于该数乘以2n。
第11章 C语言的最小数据单位——位
1
第11章 C语言的最小数据单位——位

11.1 11.2 11.3 11.4 11.5
位运算基础 位运算符 位运算实例 位段 小结
2
11.1 位运算基础

11.1.1 11.1.2 11.1.3 11.1.4
位与字节 原码 反码 补码
13
11.2.6 右移运算符



右移运算符“>>”是双目运算符。其功能是把“>>”左边的运算 数的各二进制位全部右移若干位,“>>”右边的数指定移动的位 数。 在右移时,符号位将随同移动。当为正数时,最高位补0,而为 负数时,符号位为1,最高位是补0或是补1取决于编译系统的规 定。Turbo C和很多系统规定为补1。 右移一位就相当于该数除以2,右移n位就相当于该数除以2n。上 面的例子中15左移2位后变成3=15/22。 【例11-4】本实例演示了无符号整数的右移运算。 【例11-5】本实例演示了有符号整数的右移运算。
3
11.1.1 位与字节


位(bit):表示一个二进制数码0或1,是电子计算机中最小的数 据单位。 字节(Byte):8个二进制位构成1个“字节”,它表示作为一个完 整处理单位的8个二进制数码。它是存储空间的基本计量单位。其 中,最右边的一位称为“最低有效位”或“最低位”。最左面的 一位称为“最高有效位”或“最高位”,如图所示:
6
11.1.4 补码





在反码中0还是有正负之分。而在人们的计算概念中零是没有正 负之分的。 另外,原码和反码不便于计算机内的运算,因为在计算时要单独 处理符号位,这很不方便。要是有一种方法能将符号位和其它位 统一处理、对减法也按加法处理就好了。 为了解决这个问题于是就引入了补码概念。所以补码的设计目的 是: (1)使符号位能与有效值部分一起参加运算,从而简化运算规 则。补码机器数中的符号位,并不是强加上去的,是数据本身的 自然组成部分,可以正常地参与运算。 (2)使减法运算转换为加法运算,进一步简化计算机中运算器 的线路设计。 机器数的补码可由原码得到。如果机器数是正数,则该机器数的 补码与原码一样,如果机器数是负数,则该机器数的补码是对它 的原码(除符号位外)各位取反后整个数加1得到的。
17
11.4.2 位段的引用


位段的引用和结构成员的引用相同,其一般形式为:位段变量名. 位段名。例如: data.a,data.b 位段可以赋值,例如: data.a=54; data.b=3;
【例11-8】本实例演示了位段的引用。
18
11.5 小结

wk.baidu.com

前面先后介绍了数的原码、反码和补码的由来及转换方法,位运 算符及相关的运算,位段的定义及使用。 C语言中用“位段”来访问字节中的某些位。所谓“位段”,又 称为“位域”或“位字段”,是把一个字节中的二进制位划分为 几个不同的区域,并说明每个区域的位数。每个域有一个域名, 允许在程序中按域名进行操作。
5
11.1.3 反码


用原码进行两个整数的加法运算中没有问题,问题出现在带符号 位的负数身上。为了解决这个问题,可对除符号位外的其余各位 逐位取反,就产生了反码。 机器数的反码可由原码得到。如果机器数是正数,则该机器数的 反码与原码相同,如果机器数是负数,则该机器数的反码是对它 的原码(符号位除外)各位取反而得到的。设有一数X,则X的反 码表示记作(X)反。例如: (11)反=(00001011)原=00001011 (-11)反=(10001011)原=11110100
10
11.2.3 按位异或运算符

按位异或运算符“^”是双目运算符。其功能是参与运算的两数各 对应的二进制位相异或,即当两个对应的二进制位相异时,结果 为1,否则为0。参与运算数仍以补码出现。即: 0^0=0 0^1=1 1^0=1 1^1=0 【例11-3】本实例演示了求9^5。
11
11.2.4 按位取反运算符
7
11.2 位运算符

11.2.1 11.2.2 11.2.3 11.2.4 11.2.5 11.2.6
按位与运算符 按位或运算符 按位异或运算符 按位取反运算符 左移运算符 右移运算符
8
11.2.1 按位与运算符

按位与运算符“&”是双目运算符。其功能是参与运算的两数各对 应的二进制位进行“与”运算。即只有对应的两个二进制位均为 1时,结果位才为1,否则为0。参与运算的数以补码方式出现。 即: 0&0=0 0&1=0 1&0=0 1&1=1 【例11-1】本实例演示了求9&5。
相关文档
最新文档