位运算--

一、数字系统、位、字节

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 <stdio.h>
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.位段可以以整形格式输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值