【问题标题】:Bitwise operations: C vs. Python按位运算:C 与 Python
【发布时间】:2018-01-28 10:34:15
【问题描述】:

我在这里遇到了一个奇怪的问题。考虑这段代码:

#include <stdio.h>
    int main()
    {
        printf("%u\n", (55 & 00000111) + 1);
        return 0;
    }

这段代码在编译和执行后,结果为 2。

另一方面,Python 会产生这样的结果:

>>> (55 & 0b00000111) + 1
8

为什么会有不同的结果?

【问题讨论】:

  • 00000111 不是二进制常量
  • 请原谅我的无知,但那是什么?另外,您是指 C 代码中的 00000111 吗?
  • 一般来说,如果你怀疑一种语言做一个简单的计算错误,检查你的代码。出现问题的机会要高得多。

标签: python c python-2.7 bit-manipulation bitwise-operators


【解决方案1】:

C 没有二进制的文字。所以 00000111 不是你想象的二进制文字。相反,它被解释为八进制 111(或十进制 73),因为 0 前缀表示 C 中的八进制。在 Python 的情况下,0b00000111 是一个正确的二进制文字(注意 0 前缀后面的 b)。这就是您在 C 和 Python 中得到不同结果的原因。

如果您想在 C 代码中使用二进制文字,我认为最好的方法是使用以 0x 开头的十六进制文字,因为一个十六进制数字相当于 4 个二进制数字,并且很容易将十六进制文字转换为二进制文字,反之亦然。例如,您可以在示例中使用 0x7

printf("%u\n", (55 &amp; 0x7) + 1);

【讨论】:

  • 感谢您的解释。我能够修复我的代码。干杯!
【解决方案2】:

以前缀0 开头的数字具有八进制表示,这意味着00000111octal 111 == 1 + 8 + 64 == 73

0b00000111 是二进制表示,这意味着它的值是1 + 2 + 4 == 7

当使用printf("%u\n", (55 &amp; 00000111) + 1); 时,结果是2,因为这两个数字中唯一的位是LSB --> 它等于1,加上1,你得到2

当使用(55 &amp; 0b00000111) + 155 == 32 + 16 + 4 + 2 + 1 表示所有最后 3 位都打开,等于7,加上1,你得到8

【讨论】:

  • 感谢您的解释。我能够修复我的代码。干杯!
【解决方案3】:

C中以0为前缀的数字在base-2(二进制)中不是,而是base-8(八进制)在Python中,同样可以通过在数字前加上@来实现987654321@

Python 3.5.3 (default, Jan 19 2017, 14:11:04) 
>>> (55 & 0o00000111) + 1
2
>>> 0o00000111
73
>>> 1 * 8 ** 2 + 1 * 8 ** 1 + 1 * 8 ** 0
73

C 不支持二进制整数常量。然而,作为一个扩展,GCC 确实如此,所以

#include <stdio.h>
int main()
{
    printf("%u\n", (55 & 0b00000111) + 1);
    return 0;
}

可以用 GCC 编译:

% gcc bin.c && ./a.out
8

正如其他人指出的那样,无论如何,十六进制比二进制更方便 - 您只需要记住每个十六进制数字 0-F 在二进制中的外观,并用单个十六进制数字替换 4 位组:

0000 | 0111
   0      7
--->   0x07

与二进制表示法不同,这适用于所有 C 编译器和 Python 版本。

【讨论】:

    【解决方案4】:

    您用于 C 的代码使用八进制整数,转换为十六进制时看起来像

    0xfollowed by eight characters(32 bits) here in octal ... 001 001 001
    

    1 个十六进制字符是 4 位。 而python中的代码使用二进制文字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      相关资源
      最近更新 更多