了解位的基本概念
熟悉二进制数的运算方法
掌握各种位运算的方法和技巧
熟悉位段的基本概念
掌握位段中数据的引用方法
掌握数值的转换方法和技巧
C语言区别于其他语言的重要特点是支持位运算,使其能够完成汇编语言所能完成的大部分功能。在实际的编程中借助与位运算往往可以设计出简洁的算法,使程序简化,并且获得较高的效率。另外,某些对硬件进行控制的编程中,位运算也是必不可少的。
位运算应用于整型数据,即把整型数据看成是固定的二进制序列,然后对这些二进制序列进行按位运算。与其他的高级语言相比,位运算是C语言的特点之一,在实际应用中可逐步体会其优越性。
二进制就是逢二进一,比如十进制数3转换为二进制数11,十进制数10转换为二进制数1010。要把二进制数转换为十进制数,可以使二进制数字的每一位对应一个2的某次幂,然后累加求和。
我们把二进制数中的每一个二进制数称为位(bit,比特),每个0或1就是一位,位是数据存储的最小单位。
通常,我们把一组4位二进制数称为半字节(nibble),一组8位二进制数称为一个字节(byte)。通常把两个或者4个字节称为一个字(word),两个字又称之为一个双字(double word)。
为了简单起见,这里以一个字节为例,来说明无符号数和有符号数。需要注意的是:在Microsoft Visual C++ 6.0中,整型int用4个字节32位表示一个有符号整数。
位或运算符
按位异或运算符
按位取反运算符
左移运算符
右移运算
位复合赋值运算符
按位或运算是让参与运算的两个数对应的二进制位分别相或。只要对应的两个二进制位有一个为1,结果就为1;只有当对应的两个二进制位的数都为0时,该位的运算结果才为0.。
按位异或运算是让参与运算的两个数对应的二进制位分别相异或,当两个对应的二进制位不同时,结果为1,两个对应的二进制位相同时,结果为0。
按位异或运算的主要应用:
1. 使特定位翻转。
2. 与0按位异或,保留原值。
3. 交换两个值,不需要临时变量。
按位取反运算符为单目运算符,运算对象就置于运算符的右边,具有右结合性。其功能是把运算对象的内容按位取反,即1变为0,将0变为1。例如~9的运算表示为:
~(00001001)
结果为:11110110
左移运算用来把“<
int a=8,b;
b=a<<3;
用二进制表示运算过程如下:
a: 00001000 (a=8)
b=<<3: 01000000 (b=64)
右移运算符用来把“>>”左边的运算数的各二进制位全部右移若干位,移动的位数由“>>”右边的数字指定。右移时,低位移出的二进制数舍弃,左端移入的二进制数分两种情况:对于无符号整数和正整数,高位补0,对于负整数,高位补1,这是因为负数在机器内均用补码表示。
例如:
int a=15;
a>>2;
表示把00001111(十进制15)右移2位后变为00000011(十进制3)。
右移时要注意符号位,对于有符号的数,右移时符号位将一同移动。当为正数时(符号位为0),最高位补0;为负数时(符号位为1),最高位是补0还是补1取决于编译系统的规定。有的系统移入0,有的系统移入1,移入0的称为“逻辑右移”,即简单右移。移入1的称为“算术右移”。
位运算符与赋值运算符可以组成复合赋值运算符,如:
&=,|=,>>=,<<=,^=
例如:a|=b相当于a=a|b,a>>=b相当于a=a>>b。
由前可知,位运算的对象可以是整型和字符型数据,当两个运算数类型不同时位数也不同,此时,系统将自动进行处理:先将两个运算数右端对齐,然后,再将位数短的一个运算数往高位扩充,即:无符号数和正整数左侧用0补全;负数左侧用1补全,然后对位数相等的这两个数,按位进行运算。
位段的定义
位段中数据的引用
位段定义的一般形式为:
struct 位段结构名
{位段列表};
其中“位段列表”的形式为: 类型说明符 位段名:位段长度
位段变量的说明与结构体变量说明的方式相同。可采用先定义后说明、同时定义说明或直接说明这三种方式。例如:
struct dz
{
unsigned a:3;
unsigned b:2;
unsigned c:2;
}data;
其中位段a占3位,位段b占2位,位段c占2位。
位段中数据引用的一般形式: 位段变量.位段成员
例如:data.a=3;
说明:
位段成员的类型只能是unsigned或int类型。
一个位段必须存储在同一个存储单元中,不能跨两个单元。即如果一个单元空间不能容纳一个位段,则该空间不用,而从下一个单元起存放该位段。也可以有意使某位段从下一单元开始存放。
由于位段不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进制位。
可以定义无名位段,这时它只用来作填充或调整位置,无名的位段是不能够使用的。
位段的长度不能大于存储单元的长度,也不能定义位段数组。
位段可以用整型格式符输出,也可以用%u、%o、%x等格式输出。
位段可以在数值表达式中引用,它会被系统自动转换为整型数。