C语言程序设计-提高篇-第4章位运算.ppt

上传人:max****ui 文档编号:8292064 上传时间:2020-03-28 格式:PPT 页数:39 大小:233.50KB
返回 下载 相关 举报
C语言程序设计-提高篇-第4章位运算.ppt_第1页
第1页 / 共39页
C语言程序设计-提高篇-第4章位运算.ppt_第2页
第2页 / 共39页
C语言程序设计-提高篇-第4章位运算.ppt_第3页
第3页 / 共39页
点击查看更多>>
资源描述
C语言程序设计 提高篇 第4章位运算 内容概述 位运算操作位段的概念 教学目标 字节和位的有关概念 正确使用常见的位运算符和位运算操作 牢记位段的要领及位段的使用方法 C语言既是一种高级语言 广泛应用于应用软件的开发和程序设计 同时又是一种低级语言 可以用于系统软件的开发和程序设计 如自动控制系统中的过程控制 参数检测 数据通讯等控制程序 都可以综合利用C语言中的指针操作 位运算和位段技术来实现 本章介绍位运算的基本形式和常用运算符 并简要介绍位段的概念 位运算的深入学习 应该在 计算机原理 和 汇编语言程序设计 课程中进行 位运算概述所谓 位运算 是指按二进制位进行运算 位运算的特点 运算按二进制逐位进行 没有借位和进位 位运算量 整型 int short unsiged long 字符型 以补码 ASCII码形式存储 不可为实型 4 1位运算符和位运算 位运算符 BitwiseOperators 位运算符还可与赋值运算符相结合 进行位运算赋值操作 如 a b等价于a a ba b等价于a a b位运算时的数据类型为char int 分析时要化为二进制形式 但在程序中书写及输出结果时仍为char int 负数以补码形式参与运算注意与逻辑运算区别 按位与 BitwiseAND 运算规则0用法按位清零保留某些指定位 位运算符的使用 例1 includevoidmain inta b printf Enteraandb scanf d d 计算010000 a 011111 b 010000001010 a 010000 b 000000 Enteraandb 16 31a b 16 Enteraandb 10 16a b 0 按位或 BitwiseInclusiveOR 运算规则0 0 0 0 1 1 1 0 1 1 1 1 用法按位定值为1 例2 includevoidmain unsignedchara b printf Enteraandb scanf o o Enteraandb 20 30a b 30 Enteraandb 12 20a b 32 计算010000 a 011000 b 011000001010 a 010000 b 011010 按位异或 BitwiseExclusiveOR XOR 运算规则0 0 0 0 1 1 1 0 1 1 1 0 说明相 异 则为1 相 同 则为0 例3以下程序的功能是将a数据的低4位取反 includevoidmain unsignedchara 0 x39 b a a b printf x n a 答案 0 x0f 计算00111001 a 00001111 b 00110110 与0相异或 保持原值不变与自身相异或 则全部位清零交换两个整数值a a b b b a a a b 交换两个整数值不用临时变量 includevoidmain inta 3 b 4 a a b b b a a a b printf a db d n a b 结果 a 4b 3 按位取反 One sComplement 运算规则 0 1 1 0 用法所有位翻转获得适用于不同系统的位运算模板 例4 includevoidmain inta 32767 intb a printf a d b d n a b 结果 a 32767 b 32768 计算a 原码 0111111111111111b 补码 1000000000000000 左移 LeftShift 运算规则i n把i各位全部向左移动n位最左端的n位被移出丢弃最右端的n位用0补齐用法若没有溢出 则左移n位相当于乘上2n运算速度比真正的乘法和幂运算快得多 例5以下程序的运行结果是60 includevoidmain unsignedinta 15 b b a 2 printf d d n a b 例6以下程序的运行结果是 includevoidmain inta 12 b b 0 x1f5 结果 12 96 计算已知 0 x1f5为111110101且 a为1100 a 3为1100000111110101 001100000001100000 96 右移 RightShift 运算规则i n把i各位全部向右移动n位最右端的n位被移出丢弃最左端的n位用0补齐 逻辑右移 或最左端的n位用符号位补齐 算术右移 用法右移n位相当于除以2n 并舍去小数部分运算速度比真正的除法和幂运算快得多 例7以下程序的运行结果是4 5 includevoidmain inta 16 b 20 printf d d a 2 b 2 应用示例 从整数a最右端第m个位置开始取该位开始右面n位 算法如下 b a m n 1 c 0 n d b c注 位自右向左从0开始编号 应用示例 将一个整数a循环右移n位 算法如下 b a nc c b 例8 将16进制短整数按二进制打印输出输入 F1E2输出 1111000111100010输入 13A5输出 0001001110100101 算法思想 从高位到低位逐位测试每一位是0或是1 可顺次设置屏蔽字分别为1000000000000000 0100000000000000 0000000000000001 与该数进行 运算 从而保留所需的一个位的状态 其余各位为0 若结果非零则输出1 否则输出0 includevoidmain inti shorta scanf X C语言允许在一个结构体中以位为单位来指定其成员所占内存长度 这种以位为单位的成员称为 位段 4 2位段 位段的概念 1 位段的含义位段是以位为单位定义长度的结构体类型中的成员 2 位段的构成例如 structpack unsigneda 2 unsignedb 6 unsignedc 8 intx data 这个结构体类型的变量在内存中的情况为 也可以使各个字段不恰好占满一个字节structpack unsigneda 2 unsignedb 6 unsignedc 4 intx data 则内存中的分配形式为 此处 a b c共占2个字节中的12位 空闲4位 int型的x从一个新的字节开始 对位段中数据的引用方法 1 方法 通过结构体成员来应用 如 data a 2 data b 6 2 要点 注意每个字段的最大取值范围 如 data a的取值只能是 0 3 因为两位二进制最大表示的数为3 1 若某个位段要从新的存储单元开始 可以这样定义 structpack unsigneda 2 unsigned 0 unsignedb 4 unsignedc 4 intx data 注意 长度为0的位段的作用是使下一个位段的内容从新的存储单元开始存放 位段的使用要点 位段的使用要点 2 一个位段存储在同一个机器字中 不能跨字存储 如下面的定义是错误的 假设机器的字长为16位 structpack unsigneda 2 unsignedb 5 unsignedc 10 unsignedd 4 intx data 3 可以定义无名字段structpack unsigneda 2 unsigned 5 空闲不用 unsignedb 2 unsignedc 4 intx data 位段的使用要点 4 位段可以用十进制的整型形式输出 也可以用其他的整型格式输出 如八进制 十六进制和无符号 位段以整型的形式参加算术运算 分析下面的程序 例9 voidmain structpack unsigneda 2 unsignedb 3 unsignedc 1 unsignedd 4 unsignede 3 union structpackqp unsignedi abc abc i 255 printf d n abc qp d 位段的使用要点 例10 分析下列程序的输出结果 defineN2 defineCUBE X X X X includevoidmain inti N 2 i CUBE i printf d n i 运行结果为 64 例11 下列程序的输出结果是什么 includevoidmain structequip unsigneda 2 unsignedb 3 unsignedc 1 unsignedd 4 unsignede 3 unsigned 3 union structequipeq unsignedi abc abc i 255 printf d n abc eq d 运行结果为 3 习题4 1编写一个函数getbits 从一个16位的单元中取出某几位 即该几位保留原值 其余位为0 函数调用形式为getbits value n1 n2 value为该16位 两个字节 中的数据值 n1为欲取出的起始位 n2为欲取出的结束位 如 getbits 0101675 5 8 表示对八进制101675这个数 取出它的从左面起第5位到第8位 4 2写一函数 对一个16位的二进制数取出它的奇数位 即从左边起第1 3 5 15位 4 3编一程序 检查一下你所用的计算机系统的C编译在执行右移时是按照逻辑位移的原则还是按算术右移原则 如果是逻辑右移 请你编一函数实现算术右移 如果是算术右移 请编写一函数以实现逻辑右移 4 4编一函数用来实现左右循环移位 函数名为move 调用方法为move value n 其中value为要循环位移的数 n为位移的位数 如n 0表示为左移 n 0为右移 如n 4 表示要右移4位 n 3 为要左移3位
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!