第8章 位运算_第1页
第8章 位运算_第2页
第8章 位运算_第3页
第8章 位运算_第4页
第8章 位运算_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章位运算 8 1几个基本概念 语言提供了位运算的功能 这使得 语言也能像汇编语言一样用来编写系统程序 任何信息在计算机中都是以二进制形式表示 而日常生活中使用的是十进制 由于位运算是指进行二进制位的运算 因此在学习位运算之前有必要了解与回顾一下计算机内数据组织与存储形式 8 1 1字节与位 字节 byte 是计算机中的存储单元 一个字节可以存放一个英文字母或符号 一个汉字通常要用两个字节来存储 每一个字节都有自己的编号 叫做 地址 1个字节由8个二进制位 位的英文是bit 构成 每位的取值为0或1 最右端的那1位称为 最低位 编号为0 最左端的那1位称为 最高位 而且从最低位到最高位顺序 依次编号 图8 1是1个字节各二进制位的编号 图8 11个字节各二进制位的编号 把若干字节组成一个单元 叫做 字 word 一个字可以存放一个数据或指令 至于一个字由几个字节组成 取决于计算机的硬件系统 一般由1个 2个或4个字节组成 所对应的计算机也被称为 8位机 16位机或32位机 目前微机以16位机或32位机为主 但在本书中作为原理讲述的是8位机 8 1 2原码 计算机使用的是二进制数 但这些数据有不同的编码方式 分别有原码 反码和补码 以8位计算机系统为例 我们把最高位 即最左面的一位 留做表示符号 其他7位表示二进制数 这种编码方式叫做原码 最高位为 0 表示正数 为 1 表示负数 例如 00000011表示 3 10000011表示 3 显然 这样可以表示的数值范围在 127到 127之间 这种表示方法有一个缺陷 数值0会出现歧义 00000000表示 0 10000000表示 0 8 1 3反码 对于正数 反码与原码相同 例如 00000011表示 3 所谓 反码 是指与 原码 在表示负数时相反 符号位 最高位 为 1 表示负数 但其余位的值相反 例如 11111100表示 3 显然 这样可以表示的数值范围在 127到 127之间 这种表示方法仍然有一个缺陷 数值0会出现歧义 00000000表示 0 11111111表示 0 8 1 4补码 对于正数 补码与原码相同 0的补码为00000000 这样 0的表示唯一 对于负数 可以从原码得到补码 步骤如下 把符号位不变 为1 首先 把其余各位取反 即0变为1 1变为0 其次 对整个数加1 已知一个数的补码 求原码的操作分两种情况 如果补码的符号位为 0 表示是一个正数 所以补码就是该数的原码 如果补码的符号位为 1 表示是一个负数 求原码的操作可以是 符号位不变 其余各位取反 然后再整个数加1 例如 已知一个补码为11111001 则原码是10000111 7 因为符号位为 1 表示是一个负数 所以该位不变 仍为 1 其余7位1111001取反后为1000110 再加1 所以是10000111 计算机中的数据都采用补码 原因在于 使用补码 可以将符号位和其它位统一处理 同时 减法也可按加法来处理 如 3 4可以变成 3的补码与 4的补码相加 另外 两个用补码表示的数相加时 如果最高位 符号位 有进位 则进位被舍弃 8 2位运算符和位运算 位运算符是以单独的二进制位为操作对象的运算 也就是说 其操作数是二进制数 这是与其他运算符的主要不同之处 C语言中提供的位运算符有 按位与 按位或 按位异或 按位取反 左移 此运算规则见表8 1所示 8 1位运算表 8 2 1按位取反运算符 格式 x功能 各位翻转 即原来为1的位变成0 原来为0的位变成1 主要用途 间接地构造一个数 以增强程序的可移植性 例如 x 83 y x 则y 172 83 01010011 83 01010011 172 10101100 8 2 2按位与运算符 格式 x y功能 当两个操作对象二进制数的相同位都为1时 结果数值的相应位为1 否则相应位为0 主要用途 取 或保留 1个数的某 些 位 其余各位置0 例如 x 146 y 222 z x y 则z 146 main intx 146 y 222 z z x 8 2 3按位或运算符 格式 x y功能 当两个操作对象二进制数的相同位都为0时 结果数值的相应位为0 否则为相应位是1 主要用途 将1个数的某 些 位置1 其余各位不变 例如 x 146 y 222 z x y 则z 222 main intx 146 y 222 z z x y printf x d ny d nz d n x y z 8 2 4按位异或运算符 格式 x y功能 当两个操作对象二进制数的相同位的值相同时 结果数值的相应位为0 否则为相应位是1 主要用途 使1个数的某 些 位翻转 即原来为1的位变为0 为0的变为1 其余各位不变 例如 x 146 y 222 z x y 则z 76 main intx 146 y 222 z z x y printf x d ny d nz d n x y z 8 2 5左位移运算符 格式 x 要位移的位数功能 把操作对象的二进制数向左移动指定的位 并在右面补上相应的0 高位溢出 例如 x 01010011 y x 2 则y 01001100 注意 左移会引起数据的变化 具体说 左移一位相当于对原来的数值乘以2 左移n位相当于对原来的数值乘以2n 8 2 6右位移运算符 格式 x 要位移的位数功能 把操作对象的二进制数向右移动指定的位 移出的低位舍弃 高位 对无符号数和有符号中的正数 补0 有符号数中的负数 取决于所使用的系统 补0的称为 逻辑右移 补1的称为 算术右移 例如 x 01010011 y x 2 则y 00010100 注意 右移会引起数据的变化 具体说 右移一位相当于对原来的数值除以2 右移n位相当于对原来的数值除以2n 说明 x y和 位数 等操作数 都只能是整型或字符型数据 除按位取反为单目运算符外 其余均为双目运算符 参与运算时 操作数x和y都必须首先转换成二进制形式 然后再执行相应的按位运算 例如 5 2后得5 即 10100 00101 复合赋值运算符除按位取反运算外 其余5个位运算符均可与赋值运算符一起 构成复合赋值运算符 例如 a b相当于a a b a 2相当于 a a 2 不同长度数据间的位运算 低字节对齐 短数的高字节按最高位补位 对无符号数和有符号中的正数 补0 有符号数中的负数 补1 8 3位域 位段 有些信息在存储时 并不需要占用一个完整的字节 而只需占几个或一个二进制位 例如在存放一个开关量时 只有0和1两种状态 用一位二进位即可 为了节省存储空间 并使处理简便 语言又提供了一种数据结构 称为 位域 或 位段 所谓 位域 是把一个字节中的二进位划分为几个不同的区域 并说明每个区域的位数 每个域有一个域名 允许在程序中按域名进行操作 这样就可以把几个不同的对象用一个字节的二进制位域来表示 8 3 1位域的定义和位域变量的说明 struct位域结构名 位域列表 其中位域列表的形式为 类型说明符位域名 位域长度例如 structbs inta 8 intb 2 intc 6 位域变量的说明可采用先定义后说明 同时定义说明或者直接说明这三种方式 例如 structbs inta 8 intb 2 intc 6 data 说明data为bs变量 共占两个字节 其中位域a占8位 位域b占2位 位域c占6位 说明 1 一个位域必须存储在同一个字节中 不能跨两个字节 如一个字节所剩空间不够存放另一位域时 应从下一单元起存放该位域 也可以有意使某位域从下一单元开始 例如 structbs unsigneda 4unsigned 0 空域 unsignedb 4 从下一单元开始存放 unsignedc 4 2 由于位域不允许跨两个字节 因此位域的长度不能大于一个字节的长度 也就是说不能超过8位二进位 3 位域可以无位域名 这时它只用来作填充或调整位置 无名的位域是不能使用的 例如 structk inta 1int 2 该2位不能使用 intb 3intc 2 位域在本质上就是一种结构类型 不过其成员是按二进位分配的 8 3 2位域的使用 位域变量名 位域名 8 4程序设计举例 例8 1 取一个整数a从右端开始的4 7位 到右端可以用下面方法实现 a 4 设置一个低4位全为1 其余全为0的数 可用下面方法实现 0 4 0 4 main unsigneda b c d scanf o 运行结果 0101101 654 4 例8 2 从键盘上输入1个正整数给int变量num 按二进制位输出该数 include stdio h main intnum mask i printf Inputaintegernumber scanf d 运行结果为 Inputaintegernumber 6565 0000 0000 0100 0001B 本章小结 1 位运算是 语言

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论