C 位操作

来源:互联网 发布:社交网络 肖恩帕克 编辑:程序博客网 时间:2024/06/10 13:05

二进制数/位/字节

二进制整数

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

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

有符号整数

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

10000000 = -12810000001 = -12700000000 = 000000001 = 1

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

基数

八进制

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

十六进制

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

0XA3F = 26230XC2  = 11000010
十进制 十六进制 二进制等价数 0 0 0000 1 0 0001 2 0 0010 3 0 0011 4 0 0100 5 0 0101 6 0 0110 7 0 0111 8 0 1000 9 0 1001 10 A 1010 11 B 1011 12 C 1100 13 D 1101 14 E 1110 15 F 1111

C的位运算符

掩码

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

#deinfe MASK 2flags = 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
原创粉丝点击