C中的按位运算符:此函数的工作原理如何?

时间:2014-02-07 11:49:35

标签: c operators bit-manipulation

我无法弄清楚这个功能是如何运作的:

void print3bytes(unsigned char s[],unsigned len)
{
    unsigned char *end;
    for(end=s+len-len%3;  s<end;  s=s+3 )
        printf("%x ",  s[0]|s[1]<<8  |  s[2]<<16); 
    putchar('\n'); 
}

这对于这个例子是如何工作的:

int main(void)
{
    unsigned char s[] = "\x12\x34\x56\x78\x9A\xBC\xDE\xFF";
    print3bytes(s, 8);
    return 0;
}

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:3)

表达式结合了:

  • 第一个字节s[0]
  • 第二个字节s[1]向左移位('&lt;&lt;&lt;')8位
  • 第三个字节s[2]向左移位(<<)16位

使用按位 - 或(|)。

因此,当s包含0x12,0x34,0x56作为其第一个字节时,它会计算

0x12 | (0x34 << 8) | (0x56 << 16)
  ^       ^             ^
  |       |             |
s[0]     s[1]         s[2]

0x12 | 0x3400 | 0x560000

0x563412。基本上它是从s开始在little-endian format中解包(解码,反序列化,解编组等)24位整数。

答案 1 :(得分:1)

s[0] | s[1]<<8  |  s[2]<<16

假设s [2]为0xff(255),s [1]为0xaa(170),s [0]为0x11(17)。如果你移动s [2] 16位,你得到:

0xff0000

如果你将s [1]移动8位,你得到:

0x00aa00

如果您或这些人一起得到

0xffaa00

或者用s [0]:

0xffaa11