C语言程序设计位运算.ppt

上传人:max****ui 文档编号:6332951 上传时间:2020-02-23 格式:PPT 页数:22 大小:424.81KB
返回 下载 相关 举报
C语言程序设计位运算.ppt_第1页
第1页 / 共22页
C语言程序设计位运算.ppt_第2页
第2页 / 共22页
C语言程序设计位运算.ppt_第3页
第3页 / 共22页
点击查看更多>>
资源描述
C语言允许对内存中的字节或字节内的二进制位进行运算 即位运算 12 1位运算符和位运算位运算符共6种 说明 1 位运算符中除了 是单目运算符外 其余均为二目运算符 即要求运算符两侧各有一个运算对象 2 运算对象只允许是整型或字符型数据 包括 char short int long unsigned 第十二章位运算 12 1 1 按位相与 运算符 作用 对参加运算的两个二进制数按位进行逻辑与运算 规则 0 0 0 1 0 0 0 1 0 1 1 1例如 a 1 b 2 则 a b 0 00000001 00000000 11111110 11111111 00000000 00000000 a b a b 用途 与 0可以屏蔽掉某些位 与 1可以筛选出某些位 典型的用法有 清零 欲对一个字节清零 通常是 与 上0 x00 取出一个数中的某些指定位 比如有一个整数a 欲取出它的低8位 应 00001001 00001100 11111111 00000000 00001001 00000000 a 0 x00ff c 12 1 2 按位相或 运算符 作用 对参加运算的两个二进制数逐位进行逻辑或运算 规则 0 0 0 1 0 1 0 1 1 1 1 1例如 a 1 b 1 则 a b 1 00000001 00000000 11111111 11111111 11111111 11111111 a b a b 用途 或 1可以屏蔽掉某些位 或 0可以筛选出某些位 典型的用法主要是 置1 欲对某些位置1 只需在相应位上 或 1便可 例如 a 15 b 0 则 a b 15 00001111 00000000 00000000 00000000 00001111 00000000 a b a b 例 main inta 3 b 4 a a b b b a a a b printf d d a b 输出 4 3 00000011 00000000 00000100 00000000 00000111 00000000 a b a 00000011 00000000 b 00000100 00000000 a 12 1 3 按位异或 运算符 作用 对参加运算的两个二进制数按位进行逻辑异或运算 规则 0 0 0 1 0 1 0 1 1 1 1 0 结论 利用异或运算 不必设置第三个变量就可以实现两个整型变量值的交换 用途 某位 异或 1要变 某位 异或 0不变 1 使指定位翻转 比如 要使一个字节的低四位翻转 只需异或0 x0f 00100011 a 00001111 a 0 x0f 00101100 2 清零 一个整型 含字符型 数据 异或 自身 便清零 00100011 a a 00000000 00100011 a 12 1 4 按位取反 运算符 作用 对一个二进制数按位取反 是一个单目运算符 如 a 15则 a 65520 00000000 00001111 11111111 11110000 a a 注意 和 运算符是两个完全不同的运算符 的优先级与 相同 且结合性都是从右至左 例如 main inta 0 b 1 printf d d n a b printf d d n a b 运行结果 1 21 0 00000000 00000000 11111111 11111111 0 0 应用举例 若有一个整数a 想使它最低一位为0 即屏蔽d0位 而其它位不变 请问如何操作 方法是 a a吗 答 对于以16位存放一个整型数据的计算机系统 后者也是可以的 但对于以32位 或更多位 存放一个整型数据的系统 如VAX11 780 后者是不可以的 因此 后者的可移植性很差 而前者则适合于任何系统 程序的可移植性好 16位整型 32位整型 12 1 5左移位运算 作用 将操作数的各个二进位顺序左移 右端空出的位补0 而移出左端之外的位则丢失 如 a n表示将a的各个二进位顺序左移n位 n为正整数 例如 a 25 则a 3的结果为200 00011001 00000000 11001000 00000000 a a 3 说明 1 对于无符号数 左移1位 相当于乘2 左移n位 则乘2n 但是此结论只适用于该数左移时被溢出的最高位中没有1的情况 2 对于用补码表示的正数 如果左移出的全部是0 且移出后的最高位仍为0时 数据不会溢出 3 对于用补码表示的负数 如果左移出的全部是1 且移出后的最高位仍为1时 数据不会溢出 如 11111110 11111111 11110000 11111111 2 2 3 4 若非上面 2 3 所述情况 则数据左移后会产生溢出 那就不能简单地用乘2来计算了 如 有符号字符型数据64 当它左移2位时 结果为0 00010000 00000000 按位取反加1得 16 01000000 64 00000000 64 2 12 1 6右移运算符 作用 将操作数的各个二进位顺序右移 左端空出的位补0或补1 而移出右端的位则被舍去 如 a n表示将a的各个二进位顺序右移n位 说明 右移运算的结果与操作数的符号有关 就TurboC2 0而言 1 无符号数为 逻辑右移 即左端空出位一律补0 2 有符号数为 算术右移 即正数右移 空位补0 负数右移 空位补1 一句话 算术右移是指最高位移入符号位 其它系统对有符号数可能依然采用 逻辑右移 这随系统而定 00000000 10000000 00000000 01000000 00000000 11000000 a a 1 a 1 逻辑右移 结果为16384 算术右移 结果为 16384 算术右移运算相当于除2运算 右移1位 相当于除以2 右移n位 则除以2n 例如 a 32768 12 1 7位运算符的优先级与结合性 258910 高 低 结合性 运算是从右至左 其余均按从左至右 12 1 8由位运算构成的复合赋值运算符 如 a b等价于a a ba m 1等价于a a m 1等价于a a m 1 例 x 077等价于x 077 x 2 y 2 y 3 12 1 9不同长度的数据进行位运算如果两个不同长度的数据进行位运算 系统会自动将两者按右端对齐 例如 long型a和int型b进行位运算时 b的高16位要按 符号扩展 例12 1取一整数a从右端开始的4 7位 1 先使a右移4位a 4 2 设置一个低4位全为1 其余位全为0的数 0 4 11110000 11111111 00000000 00001111 12 2位运算举例 自学 c 11111111 11111111 0 4 如输入 331 输出为 33115结论 任意指定从a变量右端m位开始 取其左面n位 只需 b a m c 0 n d b 00000000 11011001 00000000 00001101 a d 10001001 右移2位 01100010 例12 2将一个整数a循环右移n位 所谓循环右移是将a最右端的位顺序移到a的最左端 而将a中原左端的各位顺序右移 分析 1 将a左移16 n位并存入变量b中 即用b存放未来的高位 b a 16 n 11011111 10101011 01100000 00000000 a b 3 将c与b按位或运算c c b 2 将a逻辑右移n位 即原a中的左端16 n位右移了n位且被保留 而高n位变为0 c a n 00011011 11110101 c 01111011 11110101 c main unsigndea b c intn scanf o d 如输入 157653 3 输出为 15765375765同样的方法 可以实现循环左移 11011111 10101011 01111011 11110101 a c 12 3位段 以前 我们内存的存取都是以字节为单位 即信息存储至少要占用一个字节 实际上 有时存储一个信息不必占用一个或多个字节 而只需占用1位或几位便可 这在计算机过程控制和数据通信领域经常会遇到 C语言提供对这方面的处理 而且可用以下两种方法实现 1 通过位运算实现对1位或几位的操作 比如我们可以人为地将一个字节data划分为几项 假如是四项a b c d 且它们分别占1位 3位 2位 2位 如下图所示 如果欲将b的值变为6 则可以这样 data a b c d 7 0 1 将b项 4 6位 清零data data 3 将data与 6 4 进行按位或运算 即可实现将b的值变为6 7 0 2 将数6左移4位 使110成为4 6位 7 0 data data 6 4 7 4 说明 其中 1 步中的0 x8f 称为 屏蔽字 即把data中b的信息屏蔽掉 而其它信息不受影响 2 通过位段来实现对1位或几位的操作 C语言允许在一个结构体中以位为单位来指定其成员所占内存的长度 这种以位为单位的成员称为 位段 或 位域 bitfield 例如 Structpacked data unsigneda 2 unsignedb 6 unsignedc 4 unsignedd 4 inti data Structpacked data unsigneda 2 unsignedb 3 unsignedc 4 inti Structpacked datadata a b c 空闲 i 16 7 4 3 2 7 0 15 23 31 关于位段的定义和引用的说明 1 位段成员的类型必须指定为unsignedint型 2 若某一位段要从另一存储单元 字 单独开始存放 应这样定义 Structpacked data unsigneda 1 unsignedb 2 unsigned 0 unsignedc 3 在TurboC中表示c从第3个字节开始存放 3 可以定义无名字段 如 Structpacked data unsigneda 1 unsigned 2 表示这两位空间不用 unsignedb 3 unsignedc 4 4 一个位段必须存储在同一存储单元 字 中 不能跨越两个单元 如果第一个字不能容纳下一个位段 则该空间不用 而从下一个字开始存放 比如 Structpacked data unsigneda 5 unsignedb 6 unsignedc 6 inti Structpacked datadata 16 6 5 6 5 注意 上面定义的结构体共占6个字节 3个字 15 0 10 0 15 5 位段的长度不能大于存储单元 字 的长度 也不能定义位段数组 6 位段可以用整型格式符 d u o x 进行输出 如 printf d d d data a data b data c 7 位段可以在数值表达式中引用 它会被系统自动地转换成整型数据来处理 如 data a 5 data b是合法的
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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