第 12章 位运算
1
第十二章 位运算主讲 福州大学数学与计算机学院 韩晓芸
E-mail,hxy@fjtv.net
第 12章 位运算
2
为了节省内存空间,在系统软件中常将多个标志状态简单地组合在一起,
存储到一个字节(或字)中。C语言是为研制系统软件而设计的,所以提供了实现 将标志状态从标志字节中分离出来的位运算功能。
所谓位运算是指,按二进制位进行的运算。
位运算符号和位运算第 12章 位运算
3
主要内容:
1、位运算符和位运算
2、位段位运算符号和位运算第 12章 位运算
4
位运算符号和位运算
1、位运算及其运算符
1)按位与 ──&
格式,x&y
规则,对应位均为 1时才为 1,否则为 0。
例如,3&9=1,0011
& 1001
0001=1
用途,取 (或保留 )1个数的某 (些 )位,其余各位置 0。全部清 0,则与 0进行 &运算即可。
第 12章 位运算
5
1、位运算及其运算符
1)按位与 ──&
方法,将要取(保留) 的位全部设为 1,其余位都为 0,进行 &运算即可得到结果。
例,输入一个 2位十进制自然数 n,求其二进制的后 3位数值是多少?取低 8位呢?
见示范位运算符号和位运算第 12章 位运算
6
1、位运算及其运算符
2)按位或 ── |
格式,x|y
规则,对应位均为 0时才为 0,否则为 1。
例如,3|9=11,0011
| 1001
1011=11
位运算符号和位运算第 12章 位运算
7
1、位运算及其运算符
2)按位或 ── |
用途,将 1个数的某 (些 )位 置 1,其余各位不变。
方法,将该位设置为 1,其余各位为 0,进行 |运算,则得到结果。
例:将一个数的低 5位置 1,其余不变。
见示范位运算符号和位运算第 12章 位运算
8
1、位运算及其运算符
3)按位异或 ──^
格式,x^y
规则,对应位相同时为 0,不同时为 1
如,3^9=10。 见示范用途 1,使 1个数的某 (些 )位翻转 (即原来为 1的位变为 0,为 0的变为 1),其余各位不变 。
方法,该位为 1,其余位为 0,进行 ^运算 。
位运算符号和位运算第 12章 位运算
9
1、位运算及其运算符
3)按位异或 ──^
用途 2,交换两个数的值 。
方法,以下 3步 ( 交换 a,b的值 )
a=a^b;
b=b^a;
a=a^b
如,011和 101交换,见示范 。
位运算符号和位运算第 12章 位运算
10
1、位运算及其运算符
4)按位取反 ── ~
格式,~x
规则,各位翻转,即原来为 1的位变成 0,原来为 0的位变成 1。
用途,间接地构造一个数,以增强程序的可移植性 。
位运算符号和位运算第 12章 位运算
11
1、位运算及其运算符
5)按位左移 ──<<
格式,x<< 位数规则,使操作数的各位左移,低位补 0,移出的高位舍去不计 。
例子,5<<2=20。
用途,用来计算乘法运算 。 如乘以 2就是左移
1位 。
位运算符号和位运算第 12章 位运算
12
1、位运算及其运算符
6)按位右移 ── >>
格式,x>>位数规则,使操作数的各位右移,移出的低位舍弃;
高位:
1) 对无符号数和有符号中的正数,补 0;
2) 有符号数中的负数,取决于所使用的系统:
补 0的称为,逻辑右移,,补 1的称为,算术右移,。
如,20 >> 2=5。 TC2.0补 0
位运算符号和位运算第 12章 位运算
13
说明:
( 1) x,y和,位数,等操作数,都只能是整型或字符型数据 。 除按位取反为单目运算符外,其余均为双目运算符 。
( 2) 参与运算时,操作数 x和 y,都首先转换成二进制形式,然后再执行相应的按位运算 。
( 3) 位运算也可以复合形式进行,如 a&=b;
位运算符号和位运算第 12章 位运算
14
说明:
( 4) 不同长度数据间的位运算 ──低字节对齐,
短数的高字节按最高位补位:
对无符号数和有符号中的正数,补 0;
有符号数中的负数,补 1。
位运算符号和位运算第 12章 位运算
15
例,从键盘上输入 1个正整数给 int型变量 num,按二进制位输出该数 。
位运算符号和位运算第 12章 位运算
16
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’);
/*输出最高位的值 */
num <<= 1; /*将次高位移到最高位上 */
if( i%4==0 ) putchar(‘,’); }
/*四位一组,用逗号分开 */
printf("\bB\n");}
第 12章 位运算
17
程序运行情况:
Input a integer number:1000 ←┘
1000=0000,0011,1110,1000B
位运算符号和位运算第 12章 位运算
18
有时,存储 1个信息不必占用 1个字节,只需二进制的 1个(或多个)位就够用。如果仍然使用结构类型,则造成内存空间的浪费。为此,C语言引入了位段类型。
1,位段的概念与定义所谓位段类型,是一种特殊的结构类型,
其所有成员均以二进制位为单位定义长度,并称成员为位段 。
显然,使用位段类型,比使用正常类型节省了内存大小 。 见下页实例 。
位段简介第 12章 位运算
19
例,CPU状态寄存器,按位段类型定义如下,
struct status
{unsigned sign,1; /*符号标志 */
unsigned zero,1; /*零标志 */
unsigned carry,1; /*进位标志 */
unsigned parity,1; /*奇偶溢出标志 */
unsigned half_carry,1; /*半进位标志 */
unsigned negative,1; /*减标志 */
} flags;
位段简介第 12章 位运算
20
2.说明,
( 1) 位段类型是一种结构类型,因此对成员的定义和引用,均与结构类型和结构变量一样 。
( 2) 对位段赋值时,要注意取置范围 。 一般地说,长度为 n的位段,其取值范围是,0~
( 2n-1) 。
( 3) 一个位段必须保存在同一个字节单元中,
不能跨单元 。
( 4) 使用无名位段,可使其后续位段从下 1个字节开始存储 。
位段简介第 12章 位运算
21
2.说明
( 5) 不能定义位段数组 。
( 6) 位段的使用同整数一样 。 输入,输出,
引用 。 在数值表达式中引用位段时,系统自动将位段转换为整型数 。
位段简介
1
第十二章 位运算主讲 福州大学数学与计算机学院 韩晓芸
E-mail,hxy@fjtv.net
第 12章 位运算
2
为了节省内存空间,在系统软件中常将多个标志状态简单地组合在一起,
存储到一个字节(或字)中。C语言是为研制系统软件而设计的,所以提供了实现 将标志状态从标志字节中分离出来的位运算功能。
所谓位运算是指,按二进制位进行的运算。
位运算符号和位运算第 12章 位运算
3
主要内容:
1、位运算符和位运算
2、位段位运算符号和位运算第 12章 位运算
4
位运算符号和位运算
1、位运算及其运算符
1)按位与 ──&
格式,x&y
规则,对应位均为 1时才为 1,否则为 0。
例如,3&9=1,0011
& 1001
0001=1
用途,取 (或保留 )1个数的某 (些 )位,其余各位置 0。全部清 0,则与 0进行 &运算即可。
第 12章 位运算
5
1、位运算及其运算符
1)按位与 ──&
方法,将要取(保留) 的位全部设为 1,其余位都为 0,进行 &运算即可得到结果。
例,输入一个 2位十进制自然数 n,求其二进制的后 3位数值是多少?取低 8位呢?
见示范位运算符号和位运算第 12章 位运算
6
1、位运算及其运算符
2)按位或 ── |
格式,x|y
规则,对应位均为 0时才为 0,否则为 1。
例如,3|9=11,0011
| 1001
1011=11
位运算符号和位运算第 12章 位运算
7
1、位运算及其运算符
2)按位或 ── |
用途,将 1个数的某 (些 )位 置 1,其余各位不变。
方法,将该位设置为 1,其余各位为 0,进行 |运算,则得到结果。
例:将一个数的低 5位置 1,其余不变。
见示范位运算符号和位运算第 12章 位运算
8
1、位运算及其运算符
3)按位异或 ──^
格式,x^y
规则,对应位相同时为 0,不同时为 1
如,3^9=10。 见示范用途 1,使 1个数的某 (些 )位翻转 (即原来为 1的位变为 0,为 0的变为 1),其余各位不变 。
方法,该位为 1,其余位为 0,进行 ^运算 。
位运算符号和位运算第 12章 位运算
9
1、位运算及其运算符
3)按位异或 ──^
用途 2,交换两个数的值 。
方法,以下 3步 ( 交换 a,b的值 )
a=a^b;
b=b^a;
a=a^b
如,011和 101交换,见示范 。
位运算符号和位运算第 12章 位运算
10
1、位运算及其运算符
4)按位取反 ── ~
格式,~x
规则,各位翻转,即原来为 1的位变成 0,原来为 0的位变成 1。
用途,间接地构造一个数,以增强程序的可移植性 。
位运算符号和位运算第 12章 位运算
11
1、位运算及其运算符
5)按位左移 ──<<
格式,x<< 位数规则,使操作数的各位左移,低位补 0,移出的高位舍去不计 。
例子,5<<2=20。
用途,用来计算乘法运算 。 如乘以 2就是左移
1位 。
位运算符号和位运算第 12章 位运算
12
1、位运算及其运算符
6)按位右移 ── >>
格式,x>>位数规则,使操作数的各位右移,移出的低位舍弃;
高位:
1) 对无符号数和有符号中的正数,补 0;
2) 有符号数中的负数,取决于所使用的系统:
补 0的称为,逻辑右移,,补 1的称为,算术右移,。
如,20 >> 2=5。 TC2.0补 0
位运算符号和位运算第 12章 位运算
13
说明:
( 1) x,y和,位数,等操作数,都只能是整型或字符型数据 。 除按位取反为单目运算符外,其余均为双目运算符 。
( 2) 参与运算时,操作数 x和 y,都首先转换成二进制形式,然后再执行相应的按位运算 。
( 3) 位运算也可以复合形式进行,如 a&=b;
位运算符号和位运算第 12章 位运算
14
说明:
( 4) 不同长度数据间的位运算 ──低字节对齐,
短数的高字节按最高位补位:
对无符号数和有符号中的正数,补 0;
有符号数中的负数,补 1。
位运算符号和位运算第 12章 位运算
15
例,从键盘上输入 1个正整数给 int型变量 num,按二进制位输出该数 。
位运算符号和位运算第 12章 位运算
16
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’);
/*输出最高位的值 */
num <<= 1; /*将次高位移到最高位上 */
if( i%4==0 ) putchar(‘,’); }
/*四位一组,用逗号分开 */
printf("\bB\n");}
第 12章 位运算
17
程序运行情况:
Input a integer number:1000 ←┘
1000=0000,0011,1110,1000B
位运算符号和位运算第 12章 位运算
18
有时,存储 1个信息不必占用 1个字节,只需二进制的 1个(或多个)位就够用。如果仍然使用结构类型,则造成内存空间的浪费。为此,C语言引入了位段类型。
1,位段的概念与定义所谓位段类型,是一种特殊的结构类型,
其所有成员均以二进制位为单位定义长度,并称成员为位段 。
显然,使用位段类型,比使用正常类型节省了内存大小 。 见下页实例 。
位段简介第 12章 位运算
19
例,CPU状态寄存器,按位段类型定义如下,
struct status
{unsigned sign,1; /*符号标志 */
unsigned zero,1; /*零标志 */
unsigned carry,1; /*进位标志 */
unsigned parity,1; /*奇偶溢出标志 */
unsigned half_carry,1; /*半进位标志 */
unsigned negative,1; /*减标志 */
} flags;
位段简介第 12章 位运算
20
2.说明,
( 1) 位段类型是一种结构类型,因此对成员的定义和引用,均与结构类型和结构变量一样 。
( 2) 对位段赋值时,要注意取置范围 。 一般地说,长度为 n的位段,其取值范围是,0~
( 2n-1) 。
( 3) 一个位段必须保存在同一个字节单元中,
不能跨单元 。
( 4) 使用无名位段,可使其后续位段从下 1个字节开始存储 。
位段简介第 12章 位运算
21
2.说明
( 5) 不能定义位段数组 。
( 6) 位段的使用同整数一样 。 输入,输出,
引用 。 在数值表达式中引用位段时,系统自动将位段转换为整型数 。
位段简介