C 位操作

二进制数/位/字节

二进制整数

一个字节通常包括8个位。可以将这8位从左到右看作是从7到0。在字节中,位7称为高位(high-order bit),位0称为低位(low-order bit)。每位数字对应2的特定的指数。

一个字节可以存储的数的范围是0到255,总共256个可能的值。通过改变对位模式的解释方式,一个字节可以存储从-128到+127之间的整数,总共还是256个可能的值。

有符号整数

二进制补码-使用最后7位表示从-到127的值,同时高位设置为0。如果高位为1,那么该值为负。

10000000 = -128
10000001 = -127

00000000 = 0
00000001 = 1

二进制反码-反转位组合中的每一位以形成一个数的负数。

基数

八进制

八进制(octal)指以8为基数的数制系统。该系统使用8的幂。了解八进制的简单方法是每个八进制位对应3个二进制位

十六进制

十六进制(hex)指以16为基数的数制系统。该系统使用16的幂,使用的数字是0到15(0-10-ABCEF)。每个十六进制位对应于一个4位的二进制数。因此两个十六进制恰好对应一个8位字符。第一个十六进制表示高4位,第二个十六进制表示低4位。

0XA3F = 2623

0XC2  = 11000010
十进制十六进制二进制等价数
000000
100001
200010
300011
400100
500101
600110
700111
801000
901001
10A1010
11B1011
12C1100
13D1101
14E1110
15F1111

C的位运算符

掩码

“位与”运算符通常跟掩码一起使用。掩码是某些位设置开(1)而某些为设置为关(0)的位组合。

#deinfe MASK 2
flags = flags & MASK;

这个语句将导致flags的位除1之外的所有位都被设置位0,原因是它任何位使用&运算符与0组合都得0;

因为掩码中的零覆盖了flags中相应的位,所以该过程成为“使用掩码”。

一种常见的C用法如下面语句所示:

ch &= 0XFF

值0xFF的二进制形式为11111111,十进制的形式为0377。该掩码留下ch的最后8位,将其余位设为0。无论最初的ch是8位/16位或是更多,都将最终修正到一个字节中。

打开位

有时需要打开一个值中特定的位,同时保持其他位不变。下面的语句将flags中的位1设置为1,并保留其他所有位不变。

flags = flags | MASK

这是因为任何使用|运算符与0相结合结果位该位本身。

关闭位

在不影响其他位的情况下,同时能将特定的位关闭与能够将特定的位打开是一样有用的。假设相关闭flags中的位1。MASK仍然只有位1是打开的。可以这样做:

flags = flags & ~MASK;

转置位

一个位表示如果该位打开,则关闭该位;如果该位关闭,则打开该位。

flags = flags ^ MASK;

查看一位的值

假设查看一位的值。例如,flag的位1是否为1?不应该这样使用:

if ( flag == MASK) {}

flag中的其他位会使比较结果为真。必须屏蔽flag中的其他位(使用掩码),以便只把flag中的位1和MASK像比较。

if ((flag & MASK) == MASK){}

总结

每个二进制数字表示1位,每个八进制数字表示3位,每个十六进制数字表示4位。这种转化关系使二进制数字转化位八进制或十六进制变得相对简单。

  • 位反运算符(~)–将其操作数中每一位取反,将1转换位0。

  • 位与运算符(&)–用两个操作数形成一个值。如果两个操作数中某位都为1,那么结果值中对应位设为1.否则,该位设为0.

  • 位或操作符(|)–用两个操作数形成一个值。如果两个操作数中的某位中有一位为1,那么结果值中的对应位设为1;否则,该位设为0.

  • 位异或(^) – 尽在两个操作数的对应位中只有一位设为1时,结果为才设为1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值