Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按位操作:C与Python_Python_C_Python 2.7_Bit Manipulation_Bitwise Operators - Fatal编程技术网

按位操作:C与Python

按位操作:C与Python,python,c,python-2.7,bit-manipulation,bitwise-operators,Python,C,Python 2.7,Bit Manipulation,Bitwise Operators,我面临着一个奇怪的问题。考虑这段代码: #include <stdio.h> int main() { printf("%u\n", (55 & 00000111) + 1); return 0; } 为什么会有不同的结果?以前缀0开头的数字有八进制表示,这意味着00000111是八进制111==1+8+64==73 0b00000111是二进制表示,这意味着它的值为1+2+4==7 使用printf%u\n时,55&

我面临着一个奇怪的问题。考虑这段代码:

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

为什么会有不同的结果?

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

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

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


当使用55&0b00000111+1时,55==32+16+4+2+1意味着最后3位全部开启,等于7,加上1,得到8。

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

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

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


当使用55&0b00000111+1时,55==32+16+4+2+1意味着最后3位都是开的,等于7,加上1,得到8。

C没有二进制的文字。所以00000111并不像您假设的那样是二进制文字。相反,它被解释为八进制111或十进制73,因为0前缀表示C中的八进制。在Python中,0b00000111是一个正确的二进制文字,请注意0前缀后的b。这就是为什么在C和Python中会得到不同的结果

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


printf%u\n,55&0x7+1

C没有二进制的文本。所以00000111并不像您假设的那样是二进制文字。相反,它被解释为八进制111或十进制73,因为0前缀表示C中的八进制。在Python中,0b00000111是一个正确的二进制文字,请注意0前缀后的b。这就是为什么在C和Python中会得到不同的结果

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


printf%u\n,55&0x7+1

C中以0为前缀的数字不是base-2二进制,而是Python中的base-8八进制,同样可以通过以0o为前缀来实现

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

#include <stdio.h>
int main()
{
    printf("%u\n", (55 & 0b00000111) + 1);
    return 0;
}
正如其他人所指出的,无论如何十六进制比二进制更方便-您只需记住每个十六进制数字0-F在二进制中的外观,并用一个十六进制数字替换4位的组:

0000 | 0111
   0      7
--->   0x07

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

C中以0为前缀的数字不是以base-2二进制表示的,而是以base-8八进制表示的。在Python中,以0为前缀的数字也可以实现这一点

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

#include <stdio.h>
int main()
{
    printf("%u\n", (55 & 0b00000111) + 1);
    return 0;
}
正如其他人所指出的,无论如何十六进制比二进制更方便-您只需记住每个十六进制数字0-F在二进制中的外观,并用一个十六进制数字替换4位的组:

0000 | 0111
   0      7
--->   0x07

与二进制表示法不同,这在所有C编译器和Python版本中都可以使用。

用于C的代码使用八进制整数,当转换为十六进制时

0xfollowed by eight characters(32 bits) here in octal ... 001 001 001
1个十六进制字符为4位。
而python中的代码使用二进制文本。

用于C的代码使用八进制整数,当转换为十六进制时

0xfollowed by eight characters(32 bits) here in octal ... 001 001 001
1个十六进制字符为4位。
而python中的代码使用二进制文本。

00000111不是二进制常量,我不知道,但它是什么呢?另外,你的意思是C代码中的00000111吗?一般来说,如果你怀疑一种语言做了一个简单的计算错误,请检查你的代码。这个问题的可能性要高得多。00000111不是一个二元恒量,因为我不知道这里,但它是什么呢?另外,你的意思是C代码中的00000111吗?一般来说,如果你怀疑一种语言做了一个简单的计算错误,请检查你的代码。机会更大,问题就在那里。谢谢你的解释。我能够修复我的代码。干杯谢谢你的解释。我能够修复我的代码。干杯谢谢你的解释。我能够修复我的代码。干杯谢谢你的解释。我能够修复我的代码。干杯