返回本章首页

下一页

上一页

第 10章 位运算

为了节省内存空间,在系统软件中常将多个标志状

态简单地组合在一起,存储到一个字节(或字)中。C

语言是为研制系统软件而设计的,所以她提供了实现将

标志状态从标志字节中分离出来的位运算功能。

所谓位运算是指,按二进制位进行的运算。

10.1 数值在计算机中的表示

10.2 位运算

10.3 位段 上一章

下一章

返回目录

返回本章首页

下一页

上一页

10.1 数值在计算机中的表示

1.二进制位与字节

计算机系统的内存储器,是由许多称为字节的单元组

成的,1个字节由 8个二进制位( bit)构成,每位的取值为

0/1。最右端的那 1位称为“最低位”,编号为 0;最左端的

那 1位称为“最高位”,而且从最低位到最高位顺序,依次

编号。图 11-1是 1个字节各二进制位的编号。

图 11-1 1个字节各二进制位的编号

2.数值的原码表示

数值的原码表示是指,将最高位用作符号位( 0表示正

数,1表示负数),其余各位代表数值本身的绝对值(以二

进制形式表示)的表示形式。为简化描述起见,本节约定

用 1个字节表示 1个整数 。

7 6 5 4 3 2 1 0

返回本章首页

下一页

上一页

例如, +9的原码是 00001001

└→ 符号位上的 0表示正数

-9的原码是 10001001。

└→ 符号位上的 1表示负数

3.数值的反码表示

数值的反码表示分两种情况:

( 1) 正数的反码:与原码相同 。

例如, +9的反码是 00001001。

( 2) 负数的反码:符号位为 1,其余各位为该数绝

对值的原码按位取反 ( 1变 0,0变 1) 。

例如, -9的反码:因为是负数, 则符号位为, 1”;

其余 7位为 -9的绝对值 +9的原码 0001001 按位取反为

1110110,所以 -9的反码是 11110110。

返回本章首页

下一页

上一页

4.数值的补码表示

数值的补码表示也分两种情况:

( 1) 正数的补码:与原码相同 。

例如, +9的补码是 00001001。

( 2) 负数的补码:符号位为 1,其余位为该数绝对值

的原码按位取反;然后整个数加 1。

例如, -9的补码:因为是负数, 则符号位为, 1”;其

余 7位为 -9的绝对值 +9的原码 0001001按位取反为 1110110;

再加 1,所以 -9的补码是 11110111。

已知一个数的补码, 求原码的操作分两种情况:

( 1) 如果补码的符号位为, 0”,表示是一个正数, 所

以补码就是该数的原码 。

( 2) 如果补码的符号位为, 1”,表示是一个负数, 求

原码的操作可以是:符号位不变, 其余各位取反, 然后再

整个数加 1。

返回本章首页

下一页

上一页

例如, 已知一个补码为 11111001,则原码是 10000111

( -7),因为符号位为, 1”,表示是一个负数, 所以该位

不变, 仍为, 1”;其余 7位 1111001取反后为 0000110;再

加 1,所以是 10000111。

5.数值在计算机中的表示 ──补码

在计算机系统中, 数值一律用补码表示 ( 存储 ), 原

因在于:使用补码, 可以将符号位和其它位统一处理;

同时, 减法也可按加法来处理 。 另外, 两个用补码表示

的数相加时, 如果最高位 ( 符号位 ) 有进位, 则进位被

舍弃 。

返回本章首页

下一页

上一页

10.2 位 运 算

10.2.1 位运算及其运算符

1.按位与 ──&

(1)格式,x&y

(2)规则:对应位均为 1时才为 1,否则为 0,3&9=1。

例如,3&9=1,0011

& 1001

────

0001=1

(3)主要用途:取 (或保留 )1个数的某 (些 )位,其余各位置 0。

2.按位或 ──|

(1)格式,x|y

(2)规则:对应位均为 0时才为 0,否则为 1,3|9=11。

例如,3|9=11,0011

| 1001

────

1011=11

(3)主要用途:将 1个数的某 (些 )位置 1,其余各位不变。

返回本章首页

下一页

上一页

3,按位异或 ──^

(1)格式,x^y

(2)规则:对应位相同时为 0,不同时为 1,3^9=10。

(3)主要用途:使 1个数的某 (些 )位翻转 (即原来为 1的位

变为 0,为 0的变为 1),其余各位不变 。

4,按位取反 ──~

(1)格式,~x

(2)规则:各位翻转, 即原来为 1的位变成 0,原来为 0的

位变成 1:在 IBM-PC机中, ~0= 0xffff,~9=0xfff6。

(3)主要用途:间接地构造一个数, 以增强程序的可移

植性 。

5,按位左移 ──<<

(1)格式,x<< 位数

(2)规则:使操作数的各位左移, 低位补 0,高位溢出:

5<<2=20。

返回本章首页

下一页

上一页

6,按位右移 ──>>

(1)格式,x>>位数

(2)规则:使操作数的各位右移, 移出的低位舍弃;

高位:

1)对无符号数和有符号中的正数, 补 0;

2)有符号数中的负数, 取决于所使用的系统:补 0的

称为, 逻辑右移,, 补 1的称为, 算术右移, 。 例如, 20

>> 2=5。

说明,

( 1) x,y和, 位数, 等操作数, 都只能是整型或字

符型数据 。 除按位取反为单目运算符外, 其余均为双目

运算符 。

( 2) 参与运算时, 操作数 x和 y,都必须首先转换成

二进制形式, 然后再执行相应的按位运算 。

例如, 5<<2=20,0101 → 10100,20 >> 2=5,10100

→ 00101。

返回本章首页

下一页

上一页

( 3) 实现 &,|,^运算主要用途的方法

1) 构造 1个整数:该数在要取 ( 或保留 ) 的位, 或

要置 1的位, 或要翻转的位上为 1,其余均为 0。

2) 进行按位与, 或按位或, 或按位异或操作 。

( 4) 实现按位取反主要用途的方法

1) 求 ~0,间接地构造一个全 1的数;

2) 按需要进行左移或右移操作, 构造出所需要的数 。

例如, 直接构造一个全 1的数, 在 IBM-PC机中为

0xffff( 2字节 ), 而在 VAX-11/780上, 却是 0xffffffff( 4

字节 ) 。 如果用 ~0来构造, 系统可以自动适应 。 具体应

用, 请参见 [案例 11.1]。

10.2.2 应用举例

[案例 10.1] 从键盘上输入 1个正整数给 int变量 num,

输出由 8~ 11位构成的数 ( 从低位, 0号开始编号 ) 。

返回本章首页

下一页

上一页

基本思路,

( 1) 使变量 num右移 8位, 将 8~ 11位移到低 4位上 。

( 2) 构造 1个低 4位为 1,其余各位为 0的整数 。

( 3) 与 num进行按位与运算 。

/*案例代码文件名,AL10_1.C*/

/*程序功能:输出一个整数中由 8~ 11位构成的数 */

main()

{ int num,mask;

printf("Input a integer number,");

scanf("%d",&num);

num >>= 8; /*右移 8位, 将 8~ 11位移到低 4位上 */

mask = ~ ( ~0 << 4); /*间接构造 1个低 4位为 1,其余各位为 0的整数 */

printf("result=0x%x\n",num & mask);

}

返回本章首页

下一页

上一页

程序运行情况:

Input a integer number:1000 ←┘

result=0x3

程序说明, ~ ( ~0 << 4)

按位取 0的反, 为全 1;左移 4位后, 其低 4位为 0,其

余各位为 1;再按位取反, 则其低 4位为 1,其余各位为 0。

这个整数正是我们所需要的 。

[案例 10.2] 从键盘上输入 1个正整数给 int变量 num,

按二进制位输出该数 。

/*案例代码文件名,AL10_2.C*/

/*程序功能:按二进制位输出一个整数 */

返回本章首页

下一页

上一页

#include "stdio.h"

main()

{ int num,mask,i;

printf("Input a integer number,");

scanf("%d",&num);

mask = 1<<15; /*构造 1个最高位为 1,其余各位为 0的整数 (屏蔽字 )*/

printf("%d=",num);

for(i=1; i<=16; i++)

{ putchar(num&mask? ’1’, ‘0’); /*输出最高位的值 (1/0)*/

num <<= 1; /*将次高位移到最高位上 */

if( i%4==0 ) putchar(‘,’); /*四位一组, 用逗号分开 */

}

printf("\bB\n");

}

返回本章首页

下一页

上一页

程序运行情况:

Input a integer number:1000 ←┘

1000=0000,0011,1110,1000B

10.2.3 说明

1.复合赋值运算符

除按位取反运算外, 其余 5个位运算符均可与赋值运算

符一起, 构成复合赋值运算符,&=,|+,^=,<<=,>>=

2.不同长度数据间的位运算 ──低字节对齐, 短数的高

字节按最高位补位:

( 1) 对无符号数和有符号中的正数, 补 0;

( 2) 有符号数中的负数, 补 1。

返回本章首页

下一页

上一页

10.3 位段简介

有时,存储 1个信息不必占用 1个字节,只需二进制的 1个(或多

个)位就够用。如果仍然使用结构类型,则造成内存空间的浪费。

为此,C语言引入了位段类型。

1,位段的概念与定义

所谓位段类型,是一种特殊的结构类型,其所有成员均以二进

制位为单位定义长度,并称成员为位段。

例如, CPU的状态寄存器, 按位段类型定义如下:

struct status

{ unsigned sign,1; /*符号标志 */

unsigned zero,1; /*零标志 */

unsigned carry,1; /*进位标志 */

unsigned parity,1; /*奇偶 /溢出标志 */

unsigned half_carry,1; /*半进位标志 */

unsigned negative,1; /*减标志 */

} flags;

返回本章首页

下一页

上一页

显然, 对 CPU的状态寄存器而言, 使用位段类型 ( 仅需 1个字节 ), 比

使用结构类型 ( 需要 6个字节 ) 节省了 5个字节 。

2.说明

( 1) 因为位段类型是一种结构类型, 所以位段类型和位段变量的定义,

以及对位段 ( 即位段类型中的成员 ) 的引用, 均与结构类型和结构变量一

样 。

( 2) 对位段赋值时, 要注意取置范围 。 一般地说, 长度为 n的位段, 其

取值范围是,0~ ( 2n-1) 。

( 3) 使用长度为 0的无名位段, 可使其后续位段从下 1个字节开始存储 。

例如,

struct status

{ unsigned sign,1; /*符号标志 */

unsigned zero,1; /*零标志 */

unsigned carry,1; /*进位标志 */

unsigned, 0; /*长度为 0的无名位段 */

unsigned parity,1; /*奇偶 /溢出标志 */

unsigned half_carry,1; /*半进位标志 */

unsigned negative,1; /*减标志 */

} flags;

返回本章首页

下一页

上一页

原本 6个标志位是连续存储在 1个字节中的 。 由于加入

了 1个长度为 0的无名位段, 所以其后的 3个位段, 从下 1

个字节开始存储, 一共占用 2个字节 。

( 4) 1个位段必须存储在 1个存储单元 ( 通常为 1字节 )

中, 不能跨 2个 。 如果本单元不够容纳某位段, 则从下 1

个单元开始存储该位段 。

( 5) 可以用 %d,%x,%u和 %o等格式字符, 以整数

形式输出位段 。

( 6) 在数值表达式中引用位段时, 系统自动将位段

转换为整型数 。

鞍山c语言培训,10_鞍山科技大学:C语言与数据结构_ppt_大学课件预览_高等教育资讯网...相关推荐

  1. 北京科技大学C语言程序设计,第1章_北京科技大学计算机系:C语言程序设计(李玲)_ppt_大学课件预览_高等教育资讯网...

    第 1章 预备知识北京科技大学 计算机系 C 语言程序设计 2009-7-29 2说明: 本课件的配套教材为: –,C语言程序设计教程> –,C语言程序设计教程习题解答与实验指导> 北京人 ...

  2. 西安电子科技大学java答案_第3章 数 组_西安电子科技大学:JAVA语言_ppt_大学课件预览_高等教育资讯网...

    第 3章 数组 第 3章 数 组 3.1 一维数组 3.2 二维数组 第 3章 数组 3.1 一 维 数 组 一维数组是最简单的数组, 在 Java中, 数组是作为 数组类的一个实例来处理的, 故可以 ...

  3. 大学c语言第三章作业,第三章_C语言标准课件_ppt_大学课件预览_高等教育资讯网...

    第三章 C语言 的数据类型. 运算符和表达式第一节 标识符定义,用来标识常量名.变量名.函数名. 数组名.文件名等对象的有效字符序列命名规则: 1)由字母(大小写).数字.下划线 2)第一个 字符必须 ...

  4. 闽江学院c语言期末试卷,Matlab期末复习08_闽江学院:matlab6.5(周赢武)_ppt_大学课件预览_高等教育资讯网...

    Matlab期末复习 2008.06.04 第 1章 MATLAB语言概述 第 2章 基本语法 第 4章 Matlab的其它函数库 第 6章 Matlab在信号与系统中的应用 第 9章 Matlab工 ...

  5. c语言程序设计课件数组,第五章 数组_《C语言程序设计(Visual C++ 6.0环境)》电子教案_ppt_大学课件预览_高等教育资讯网...

    1 2 3 0 [ ], (1) ( ) int a[6]; a[0]0 1 4 5 a[1] a[2] a[3] a[4] a[5] 2 3 a =* sizeof() 5.1 4 [ ] int ...

  6. 华科计算机层次结构图,xchap-2-2_华中科技大学计算机学院:2007本科计算机系统结构(刘芳)_ppt_大学课件预览_高等教育资讯网...

    2.3.1 指令的组成 一般的指令主要由两部分组成: 操作码 通常包括两部分内容: 操作种类,加.减.乘.除.数据传送.移位.转移.输入输出操作码( OPC) 地址码( A) 2.3 指令格式的优化( ...

  7. 计算圆环面积的c语言程序,C0610求圆环面积_C语言程序设计源代码_doc_大学课件预览_高等教育资讯网...

    #include void main() { double r2,r1,s; double area_ring (double x,double y); /*函数原型,求圆环面积*/ printf(& ...

  8. 输入三门成绩求平均成绩的C语言代码,C0417求平均成绩_C语言程序设计源代码_doc_大学课件预览_高等教育资讯网...

    #include"stdio.h" void main() { int x,y,z,sum,ave,corr,need; printf("请输入学生的三门功课的考试成绩: ...

  9. 图十字链表并求度c语言,第5章_西安电子科技大学出版社:算法与数据结构-C语言描述(樊希平)_doc_大学课件预览_高等教育资讯网...

    第5章 数组和广义表要点: 1.掌握数组元素存储位置的换算: 2.了解特殊矩阵地存储方法和元素存储位置计算: 3.了解广义表的长度.深度.head.tail等概念和操作和存储结构. 教材习题解答: 5 ...

最新文章

  1. Python 代码转 Latex 公式,这个开源库用一行代码帮你搞定
  2. 互联网黄金十年的黄昏——是人工智能的黎明还是裁员的长夜
  3. vim在每行行首或行尾添加或删除内容
  4. crypto安装_CryptoPP库在Linux系统下的安装与测试
  5. C++特化的应用——类型萃取
  6. boost::spirit模块将 QString 数据类型用作 Qi 属性的测试程序
  7. centos8 安装docker_CentOS 8 安装 docker
  8. 文件下载至storage_如何防止Storage Sense在Windows 10上删除下载的文件
  9. arrayrand php,php中array_rand函数的功能起什么作用呢?
  10. pymysql连接mysql数据库try_pymysql 连接数据库和基本使用
  11. 为了治好你的脸盲,这家表情包网站开源了一个明星识别器丨GitHub
  12. Linux php.ini设置date.timezone=XXX为什么不生效?
  13. 接口自动化测试框架搭建(5、封装get.post请求方法)--python+HTMLTestRunnerCN+request+unittest+mock+db
  14. 「面试必背」TCP,UDP,Socket,Http网络编程面试题(快收藏)
  15. QGIS3.20 制作栅格动画
  16. 中国互联网络发展状况统计报告计算机,CNNIC发布《第22次中国互联网络发展状况统计报告》...
  17. 查看服务器显卡GPU型号
  18. win10设置计算机关机时间,w10怎么设置自动关机_win10电脑设置自动关机的方法
  19. 如何在网页上添加分享按钮
  20. 基于爬取百合网的数据,用matplotlib生成图表

热门文章

  1. 全景视角下的世界探索——三维全景地图
  2. [转]自定义Drawable实现灵动的红鲤鱼动画(上篇)
  3. Java学习意见 (来自CSDN 网友wlh86618 )
  4. 基于C语言的8深度灰度BMP文件读写
  5. webservice:com.sun.xml.internal.ws.server.ServerRtException: [failed to localize]
  6. M1芯片电脑安装cerebro
  7. 4_竞赛无人机基本自动飞行支持函数与导航控制函数解析——零基础学习竞赛无人机搭积木式编程
  8. php文件 怎么写韩文,php插入韩文txt文件内的数据,SQL-Front显示乱码
  9. JAVA数字大写金额转换
  10. 织梦网站如何上传服务器还原,网站转移教程:织梦系统数据库备份和还原的方法步骤...