位操作

1.有符号数与无符号数

a 符号量表示法:有符号数保留一位高位表示数的符号,范围:-127~+127。存在问题:-0 与+0

b 二进制补码:范围:-128~+127.

高位为1时,该值为负数。确定数值的方法:从一个9位数组合1 0000 0000(256的二进制形式)减去一个负数的位组合,得   到该负数值的数量值。

例如:1000 0000,作为无符号数时,数值为128.作为有符号数时,该数为负数,1 0000 0000-1000 0000=1000 0000(128),该数为-128(在符号量中该数为-0)。

二进制补码数取相反数:反转每一位,然后再加1. 比如 1是0000 0001,所以-1为 1111 1110+1=1111 1111 。当一个数为负数时,求解其数值,可以使用相反数来求解。例如,1000 0001 ,相反数为0111 1110 +1 =0111 1111 (该相反数为127),所以该数值为-127.

位逻辑运算符:&(与)、|(或)、~(反码)、^(异或)。

掩码:flag&=MASK,flag中的位只有在MASK中对应位是1时才可见。例,ch &=0xff /* ch &= 0377*/ 0xff二进制1111 1111 ,十进制为0377.   该掩码留下ch的最后8位,其余为设为0.无论ch为8位,16位等等,最终被修正到一个字节中。

打开位:flag | = MASK。根据MASK中打开的位将flag中对应的位设为1,其余位不变。

关闭位:关闭flag中的某一位,MASK中对应的位设为0,其余位设为1.flag&=MASK

转置位:flag^=MASK, flag中对应掩码位为1的位被转置对应掩码位为0的位不改变

flag:    0  0   1    1

MASK:0  1    0    1

结果:   0  1    1    0      

查看某一位: (flag &=MASK)==MASK,屏蔽flag中的其他位,设为0,查看位设为1,然后再与MASK进行比较判断是否相等。

移位运算符:

 左移<< ,乘以2的n次幂

 右移 >>. 非负数时,除以2的n次幂。对于有符号数,右移操作的结果根据系统可能会有所不同。

例如: 10001010 >>2   ---  00100010   或者----11100010

位字段 

位字段是一个signed int  或unsigned int 中一组相邻的位。位字段有一个结构声明建立,该结构声明为每个字段提供标签,并决定字段的宽度。

struct{

            unsigned int a:1;

            unsigned int b : 2;

            unsigned int c : 8;

}code;

创建了1个1位字段,1个2位字段,1个8位字段。赋值code.a=0; code.b=3;code.c=103; 确保值没有超出字段的容量。

若超出,会使用下一个unsigned int存储位置。不允许一个字段跨越两个unsigned int 之间的边界。编译器自动地移位一个这样的字段定义,使字段按unsigned int边界对齐。

struct{

            unsigned int a:1;

            unsigned int   :2;

            unsigned int b : 2;

            unsigned int   :0;

            unsigned int c : 8;

}code;

code.a 和code.b之间有一个2位的间隙。code.c存储在下一个int中。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值