第 11 章 位运算

24
11 11 C C 目目目目目目目目目 目目目目目目目目目 第 11 第 第第第 11.1 第第第第第 11.2 第第第第 11.3 第第 11.4 第第第第

Upload: vangie

Post on 16-Jan-2016

67 views

Category:

Documents


4 download

DESCRIPTION

第 11 章 位运算. 11.1 位运算基础 11.2 位运算符 11.3 位域 11.4 应用实例. 11.1 位运算基础. 11.1.1 字节和位 11.1.2 原码、反码、补码. 11.1.1 字节和位. 大多数计算机的 内存储器 是由许多被称为 “ 字节 ” ( byte )的单元组成。 每一个字节有一个 地址 。若干个字节组成一个存储单元,称为 “ 字 ” ( word )。 一个字节一般由 8 个 二进位 组成,每个二进位的值是 0 或 1 。. 11.1.2 原码、反码、补码. 1. 原码 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

第 11 章 位运算

11.1 位运算基础11.2 位运算符11.3 位域11.4 应用实例

Page 2: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.1 位运算基础

11.1.1 字节和位11.1.2 原码、反码、补码

Page 3: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.1.1 字节和位

大多数计算机的内存储器是由许多被称为“字节”( byte )的单元组成。

每一个字节有一个地址。若干个字节组成一个存储单元,称为“字”( word )。

一个字节一般由 8 个二进位组成,每个二进位的值是 0 或 1 。

Page 4: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.1.2 原码、反码、补码 1. 原码

只将最高位做符号位(以 0 代表正,以 1 代表负),其余各位代表数值本身的绝对值。 2. 反码

一个数如果为正,则它的反码与原码相同;一个数如果为负,则符号位为 1 ,其余各位是对原码取反。 3. 补码

补码的规定如下: 正数:其原码、反码、补码相同。

负数:最高位为 1 ,其余各位为原码的相应位取反,然后对整个数加 1 。

Page 5: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.2 位运算符

11.2.1 按位与运算符

按位与运算符“ &” 是双目运算符。其功能是参与运算的两数各对应的二进位相与。

11.2.2 按位或运算符

按位或运算符“ |” 是双目运算符。其功能是参与运算的两数各对应的二进位相或。

Page 6: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.2 位运算符

11.2.3 按位异或( XOR )运算符

按位异或运算符“ ^” 是双目运算符。其功能是参与运算的两数各对应的二进位相异或,

11.2.4 取反运算符

为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位取反。

Page 7: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.2 位运算符 11.2.5 左移运算符 <<

左移运算符“ <<” 是双目运算符。其功能把“ <<” 左边的运算数的各二进位全部左移若干位,由“ <<” 右边的数指定移动的位数,高位丢弃,低位补0 。

11.2.6 右移运算符 >>

右移运算符“ >>” 是双目运算符。其功能是把“ >>” 左边的运算数的各二进位全部右移若干位,“ >>” 右边的数指定移动的位数。

Page 8: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.3 位域

所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。

1. 位域的定义和位域变量的说明

位域定义与结构定义相仿,其形式为:

struct 位域结构名 {位域列表 }

其中位域列表的形式为:

类型说明符 位域名:位域长度位域变量的说明与结构变量说明的方式相同。

Page 9: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.3 位域

对于位域的定义尚有以下几点说明:

( 1 )一个位域必须存储在同一个字节中,不能跨两个字节。

( 2 )由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度。

( 3 )位域可无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。

Page 10: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.3 位域

2. 位域的使用

位域的使用和结构成员的使用相同,其一般形式为:

位域变量名 . 位域名

位域允许用各种格式输出。

Page 11: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.3 位域

【例 11-5 】main(){ struct bs /* 定义位域结构 bs*/ { unsigned a:1; unsigned b:3; unsigned c:4;

} bit,*pbit; /* 说明 bs 类型的变量 bit 和指向 bs 类型的指针变量 pbit */

bit.a=1; /* 分别给三个位域赋值 */

Page 12: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.3 位域

bit.b=7;

bit.c=15;

printf("%d,%d,%d\n",bit.a,bit.b,bit.c);

pbit=&bit; /* 位域变量 bit 的地址送给指针变量 pbit*/

pbit->a=0; /* 用指针方式给位域 a 重新赋值 */

pbit->b&=3; /* 复合的位运算符 &=*/

pbit->c|=1; /* 使用复合位运算符 |=*/

printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);

}

Page 13: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.3 位域

【例 11-5 】程序运行结果如下图所示。

Page 14: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.4 应用实例

【例 11-6 】取一个整数 a 从开始的 4~7位。

编程思想:

( 1 )先使 a 右移 4 位,使要取的 4 ~ 7位移到最右端。

( 2 )设置一个低四位全为 1 ,其余全为0 的数。可以这样取得~(~ 0<<4 )。

( 3 )将上面两者进行&运算。

Page 15: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.4 应用实例

源程序:#include < stdio.h >main(){ unsigned a,b,c,d; scanf("%o",&a); b=a>>4; /* 使 a 右移 4 位 */ c=~(~0<<4); /* 设置一个低四位全为 1 ,

其余全为 0 的数 */ d=b&c; /* 进行位与运算 */ printf("%o\n%o\n",a,d);}

Page 16: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.4 应用实例

【例 11-6 】程序运行结果如下图所示。

Page 17: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.4 应用实例

【例 11-7 】循环移位。要求将 a 进行右循环移位,即将 a 中原来左面的( 16-n )位右移n 位,原来右端 n 位移到最左边 n 位,假设用两个字节存放一个整数。编程思想:( 1 )将 a 的右端 n 位先放到 b 中的高 n 位中,可以用下面的语句实现:b=a<<(16-n)( 2 )将 a 右移 n 位,其左面高 n 位补 0 ,可以用下面的语句实现:c=a>>n

Page 18: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.4 应用实例

( 3 )将 c 与 b 进行按位或运算,即:c=c|b ,如下图所示。

Page 19: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.4 应用实例 源程序:#include < stdio.h >main(){ unsigned a,b,c; int n; scanf("a=%o,n=%d",&a,&n); b=a<<(16-n); /* 将 a 的右端 n 位先放到

b 中的高 n 位中 */

c=a>>n; /* 将 a 右移 n 位,其左面高 n 位补 0*/

c=c|b; /* 进行按位或运算 */ printf("%o\n%o",a,c); }

Page 20: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.4 应用实例

【例 11-7 】程序运行结果如下图所示。

Page 21: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.4 应用实例

【例 11-8 】使用位运算来测试所使用的机器的机器字长度。

编程思想:

因为整型( int 或 unsigned )的长度与机器字长度相同,所以测试所用的机器的机器字长即确定一个整型变量的存储单元的位数。实现方法上可以先将一个整型变量置为全 1 ,然后通过移位来统计最初的 1 的个数。移位时,无论左移或是右移都必须保证填充位为 0 ;否则,程序将死循环,永远不可能得到正确的结果。

Page 22: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.4 应用实例 源程序:#include "stdafx.h"main(){

unsigned k=~0; /* 置变量 k为全 1*/int bits = 0; /* 声明变量 bits ,用于

记录变量 k的存处位数 */while(k!=0){

k<<=1; /* 将变量 k左移一位后再赋给 k*/++bits; /* 每移一位,位数加一 */

}printf("bits=%d\n",bits); /*打印机器字长 */getchar();

}

Page 23: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页

11.4 应用实例

【例 11-8 】程序运行结果如下图所示。

Page 24: 第 11 章  位运算

目 录

下一页

退 出

第第 1111章章

CC语言程序设计及应用语言程序设计及应用

上一页 bye