按位运算:C与Python

时间:2017-08-20 05:09:25

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

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

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

此代码在编译和执行时会产生2作为结果。

另一方面,Python产生了这个:

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

为什么会有不同的结果?

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

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

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

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

使用(55 & 0b00000111) + 1时,55 == 32 + 16 + 4 + 2 + 1表示所有3个最后位都打开,等于7,并添加1,您得到8

答案 2 :(得分:0)

C中前缀为0的数字在base-2(二进制)中,但是base-8(八进制)在Python中,通过在数字前加上 {可以实现相同的效果{1}}

0o

C不支持二进制整数常量。但是,作为扩展,GCC会这样做,所以

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

可以使用GCC编译:

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

正如其他人所指出的那样,十六进制比二进制方便得多 - 你只需要记住每个十六进制数字0-F如何以二进制形式查找,并用一个十六进制数字替换4位组:

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

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

答案 3 :(得分:0)

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

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

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