一、数字系统、位、字节
1.数字系统(进位计数制)
1)数码:表示数值大小不同的符号。
例如十进制有10个数码,二进制有2个数码,十六进制有16个数码
2)基数:数制所使用数码的个数,在位运算中,当某一位上达到或超过基数大小的时候,就会向前进一。
例如十进制满十进一,二进制满二进一。
3)位权:数制中每一固定位置对应的单位值,即各进位制中位权的值是基数的若干次幂
例如十进制123,1的位权是10²=100,2的位权是10¹=10,3的位权是10º=1。
2.位和字节(表示信息的单位)
1)位(b):构成信息的最小数据单位。一位二进制可表示2¹=2个信息,如是或否,有或无等。
2)字节(bite):计算机数据储存和处理信息的基本数据单位。规定一个字节为8位,即8个二进制位是一个字节。
3)其它:1KB=1024B,1MB=1024×1024B,1GB=1024×1024×1024B.
二、位运算符与位运算
1.位 逻辑运算符(与逻辑运算规则相同)
1)“按位与”运算(&):指参加运算的两个数据,按对应的二进制位分别进行“逻辑与”运算。如果两个相应的二进制位都为1,则该位的运行结果为1(真);否则为0(假)。
2)“按位或”运算(|):指参加运算的两个数据,按对应的二进制为分别进行“逻辑或”运算。如果两个相应的二进制为都为0,则该位的运算结果为0(假);否则为1(真)。
//将一个八位的二进制整数的底四位置全部变为1,高四位不变
#include
int main()
{
char x=67;
printf("x初值为%d\n",x); //初值67的二进制为0100 0011
x=x|15;
printf("x|15运算后的值为%d\n",x); //结果79的二进制为0100 1111
return 0;
}
3)“按位异或”运算(^):指参加运算的两个数据,按对应的二进制位分别进行“逻辑异或”运算。如果两个相应的二进制位不相同,则该位的运算结果位1(真);否则为0(假)。
4)“按位取反”运算(~):是唯一的一个单目运算符,用来将一个二进制数的每一位取反。
2.位 移位运算与运算
1)”左移“运算(<<):将一个数的各二进制位依次左移若干位,左移时,右端补0,左端移出的部分舍去。
运算对象<<左移位数 //其为双目运算符,一般运算形式如左
2)”右移“运算(>>):右移的作用与左移相似,但左端移入的二进制数分两种情况:对于无符号数和正整数,高位补0;对于负整数,有的系统高位补1(算术右移),有的系统高位补0(逻辑右移)
3.位运算赋值运算符(&=、|=、^|、>>=、<<=)
1)运算规则:与符合运算符的运算规则相似,具有右结合性。
2)补位原则:对于有符号数据,若a为正整数,则左端补0,若a为负数,则左端补1。
对于无符号数据,往左端补0。
PS:不同类型的整形数据(即数据长度不同)在进行混合类型的位运算时,系统会按右端对齐原则进行处理,按数据长度大的数据进行处理,将数据长度小的数据左端补0或1。例如,char a与int b进行位运算时,按int进行处理,char a转化为整形数据,并在左端补0。
三、位段(一种特有的压缩信息的数据结构,是以位为单位来定义结构体中的成员变量所占的存储空间的长度。含有位段的结构体称为位段结构)
1.位段结构类型
1)定义格式:
struct 位段结构类型名
{
类型说明符1 位段名1:位段1占用位数;
类型说明符2 位段名2:位段2占用位数;
类型说明符n 位段名n:位段n占用位数;
};
定义注意事项:
a.位段的类型只能是int或unsighed类型,不能是char型或浮点型。
b.在位段结构中还可以定义无名位段,起位段之间的分割作用。无名位段不能被访问,但是会占据空间。
c.一个位段必须存储在同一存储单元,不能横跨两个存储单元。如果一个单元空间不够,则系统从下一个单元起存放该位段(上述“存储单元”可能是1个字节,也可能是2个字节,视不同的编译系而异)
struct packed2
{
unsighed f1: 8;
unsighed f2: 4;
unsighed f3: 6;
unsighed f4: 2;
};
/*在这个位段定义中,f1占前8位,f2占随后4位,因为再加上f3需要的6位就超过16位了,所以f3从下一个存储单元开始存放*/
d.长度为0的无名位段,可以强制其下一个位段到下一个存储单元存放
2.位段结构类型变量的定义与引用
1)定义位段结构类型的变量方法与其他结构类型变量的定义方法一样
2)位段成员的引用:
位段变量名.位段名
3)注意事项
a.若赋值超过了位段所允许的最大范围,系统会自动取数的低位
b.位段可以在表达式中被引用,并被系统自动转换成整形数。
c.位段可以以整形格式输出