【问题标题】:C++ Bitwise Shift using a File Pointer使用文件指针的 C++ 位移位
【发布时间】:2013-02-07 00:54:11
【问题描述】:

我正在阅读别人的代码,但不太明白它是如何工作的。这是三行代码。我想知道w3的值是什么:

int w1 = fgetc(fp) & 0xFF;
int w2 = fgetc(fp) & 0xFF;
int w3 = w1 + (w2 << 8);

我知道 fgetc() 从 FILE* fp 返回一个字符,但是当他在值为 0xFF 的字符上使用 & 运算符时,我感到很困惑。然后在 w2 上使用按位移位运算符并将其添加到 w1。我不确定我应该期待一个字符还是一个整数。这是一个程序的代码 sn-p,它从文件中读取二进制数据,生成 UV 坐标作为输出。但我不太关心这个,更关心上面的代码是如何工作的。

提前感谢您的任何回复。

【问题讨论】:

  • 首先,fgetc() 返回一个int,而不是一个字符。其次,他清除了返回的 int 的低 8 位以外的所有值,然后将第二个 8 位值 w2 滑入 @ 的低 16 位 (0..15) 的第 8-15 位987654326@。完成后,他将拥有(假设为 32 位整数)0x0000w2w1 作为w3 中的值,但是更重要的是,如果fp 位于EOF,并且EOF 在任一fgetc() 上返回,这可能会很快变得丑陋.

标签: c++ hex bit-manipulation operator-keyword shift


【解决方案1】:

&amp; 0xff 确保结果是无符号的。然后,w1 + (w2 &lt;&lt; 8) 从这两个字节中生成一个 16 位整数。实际上,这段代码 sn-p 正在读取一个 little-endian 的两字节整数。

【讨论】:

    【解决方案2】:

    int w1 = fgetc(fp) &amp; 0xFF; 所做的是将接收到的int 屏蔽为单个字节。 (fgetc() 毕竟返回 int

    w1 + (w2 &lt;&lt; 8); 所做的是将两个字节组合成一个 int。可能试图反序列化以前序列化的整数。 (如果字节序是一个问题,这不是最好的方法)

    【讨论】:

    • 好吧,如果指定整数以little-endian格式存储,这是最好的方式。
    • 确实如此,如果你在同一个平台上阅读和写作。
    • @nneonneo 最便携的方法是读取 2 个字节并使用 htonl 进行转换。我猜这取决于您对“最佳”的定义。
    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2019-04-28
    • 2012-02-15
    • 2012-09-15
    相关资源
    最近更新 更多