- 1、本文档共17页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章 C语言位运算与位段
前面介绍的各种运算都是以字节为基本单位而进行的,但在很多系统程序中常要求在位(bit)一级进行运算或处理,而C语言提供的位运算使得C语言能像汇编语言一样用来编写系统程序。 学习重点: ? ?位运算 ? ?位段 位运算的作用是按二进制位对运算对象进行操作,它能够对字节或字(双字节)中的位进行检测、设置或移位,它只适用于字符型和整型数据。 C语言提供了六种位运算符: 按位与 | 按位或 ^ 按位异或 ~ 取反 左移 右移 其中,~?为单目运算符,结合性为从右到左;其余都为二目运算符,结合性为从左到右。 8.1.1 按位与运算 按位与运算表示参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1;否则为0。参与运算的数以补码方式出现。 例如,95按如下运算: 可见,95=1。 按位与运算通常用来对某些位清0。例如把整型变量a的高八位清0,低八位不变,可作a255运算(255的二进制数为0000000011111111)。 8.1.2 按位或运算 按位或运算表示参与运算的两数各对应的二进位相或。只要对应的两个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。 例如,9?|?5按如下运算: 可见,9?|?5=13。 按位或运算通常用来对某些位置1。例如把整型变量a的低八位置1,高八位不变,可作a|255运算。 8.1.3 按位异或运算 按位异或运算表示参与运算的两数各对应的二进位相异或。当对应的两个二进位相同时,结果位为0,相异时,结果为1。参与运算数仍以补码出现。 例如,9^5按如下运算: 可见,9^5=12。 8.1.4 求反运算 对参与运算的数的各二进位按位求反。 例如,~?9的运算为: ~?(0000000000001001) 其结果为1111111111110110(?-10的补码) 8.1.5 左移运算 左移运算表示把“”左边的运算数各二进位全部向左移,移动的位数由“”右边的数指定。高位丢弃,低位补0。 例如: a4; 表示把a的各二进位向左移动4位。若a?=十进制3),则左移4位后十进制48)。 8.1.6 右移运算 右移运算表示把“”左边的运算数各二进位全部向右移,移动的位数由“”右边的数指定。 例如,设a?=?15,则a2表示把000001111右移十进制3)。 需要说明的是,对于有符号数,右移时,符号位将随同移动。当为正数时,最高位补0;而为负数时,符号位为1,最高位是补0或补1取决于编译系统的规定。Turbo C和很多系统规定为补1。 8.1.7 位运算赋值运算符 位运算符与赋值运算符可以组成复合赋值运算符,如?=,|=,=,=,^=等。 例如,a = b相当于a = a b,a ?=?2相当于a?=?a 2。 有些信息在存储时,并不需要占用一个完整的字节,而只需占一个或几个二进制位。例如,当存放一个开关量时,只有0和1两种状态,用一个二进位即可。为了节省存储空间,并使处理简便,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或“位域”。 在结构体中位段的定义格式为: unsigned 成员名:二进制位数; 例如: struct bytedata { unsigned a:2; /*位段a,占2位*/ unsigned b:6; /*位段b,占6位*/ }data; 定义了名为bytedata的结构体,含两个位段成员,其中位段a占2位,位段b占6位。同时还定义了该结构体类型的变量data。 引用结构体的位段成员同引用结构体其他类型成员一样,但应注意位段的最大取值范围不要超出二进制位数限定的范围,否则超出部分会丢失。 例如: data.a=2; /*正确*/ data.a=10; /*错误,超出范围(a占2位,能容纳的最大值为3)*/ 关于位段,还需要注意以下几点: (1) 位段成员的数据类型必须是unsigned。 (2) 可以定义长度为0的位段,这使下一位段从下一存储单元(一个存储单元一般是两字节)开始。例如: struct bytedata {
文档评论(0)