【问题标题】:Bitwise operators in C: how this function works?C 中的位运算符:这个函数是如何工作的?
【发布时间】:2014-02-07 11:49:34
【问题描述】:

我不知道这个函数是如何工作的:

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;
}

谁能解释一下?

【问题讨论】:

  • 你到底有什么不明白的?
  • 这个:s[0] | s[1]
  • 其中哪一部分你不明白?

标签: c operators bit-manipulation


【解决方案1】:

表达式结合:

  • 第一个字节s[0]
  • 第二个字节 s[1] 向左移动 (`
  • 第三个字节 s[2] 向左移动 (&lt;&lt;) 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 位整数进行解包(解码、反序列化、解编组等)。

【讨论】:

  • @Alex 不客气。如果您愿意,请随时点击复选标记接受答案。
【解决方案2】:
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

and or this with s[0]:

0xffaa11

【讨论】:

    猜你喜欢
    • 2020-12-31
    • 2018-07-17
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2015-10-23
    • 1970-01-01
    • 2010-10-21
    相关资源
    最近更新 更多