C语言 两个二进制数的异或问题



我有一个从0到16的数字列表,我想用0110对它们的二进制形式进行XOR。

我已将数字放在 int j 中,并将通过一个循环来到达每个数字。以下是我的代码行。

j2 = j^(binaryToDecimal(0110));

但是,我无法得到我想要的结果。例如,0 XOR 0110 给我的结果是 16 而不是 0110B = 6。我在这里错过了什么?

如果需要,这是我的二进制到十进制代码:

long binaryToDecimal(long n) {
int remainder;
    long decimal = 0, i=0;
    while(n != 0) {
        remainder = n%10;
        n = n/10;
        decimal = decimal + (remainder*pow(2,i));
        ++i;
    }
    return decimal;
}

代码的问题在于,当您将"0110"作为参数传递时,编译器将其视为八进制数,即 0110 ==> 72(十进制(。

相反,在参数中传递"110"。哟会得到预期的结果。

如前所述,0110是一个八进制数,因此binaryToDecimal(0110)不起作用。您可以使用类似的语法来表示所需的数字(只要您使用的编译器支持 C++14 或更好(和 0b0110 .与binaryToDecimal(110)相比,这可能更清楚地表达了您的意思.

有了这个,你的第一行将写成

j2 = j^0b0110;

在 C 中,任何以 0 为前缀的">数字"都将被解释为八进制。

以下是常见的数字前缀:

  • 0b10110 - 使用 0b 前缀指定二进制文件(基数 2( - 仅受某些 C 编译器支持
  • 026 - 使用0前缀指定八进制(基数 8(
  • 22 - 指定带有">no"前缀的十进制(以 10 为基数(
  • 0x16 - 使用0x前缀指定十六进制(基数 16(

上面所有的例子都是相等的(22十进制/以10为基数(。

到目前为止,我的首选方法是让您熟悉十六进制。这将完全消除您对">将二进制转换为x"函数的依赖,以及该函数中的任何实现错误。

尝试:

j2 = j ^ 0x06;

或者(如果您的编译器支持(:

j2 = j ^ 0b0110;

这是清晰,简洁和中肯的。

最新更新