两个二进制数的XOR问题

时间:2017-03-27 05:59:59

标签: c binary decimal xor

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

我已将数字放在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;
}

3 个答案:

答案 0 :(得分:4)

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

相反,传递“110”作为参数。哟会得到预期的结果。

答案 1 :(得分:0)

在C中任何' 数字'带有0前缀的将被解释为八进制。

以下是常见的数字前缀:

  • 0b10110 - 指定二进制(基数2),0b前缀 - 仅支持某些C编译器
  • 026 - 使用0前缀
  • 指定八进制(基数为8)
  • 22 - 使用' '指定小数(基数为10)前缀
  • 0x16 - 使用0x前缀
  • 指定十六进制(基数为16)

以上所有示例都相同(十进制/基数为22)。

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

尝试:

j2 = j ^ 0x06;

或(如果你的编译器支持它):

j2 = j ^ 0b0110;

这是清楚,简明和重点。

答案 2 :(得分:0)

如前所述,0110是一个八进制数,因此binaryToDecimal(0110)将无效。您可以使用类似的语法来表达您想要的数字(只要您使用支持C ++ 14或更高版本的编译器)0b0110。与binaryToDecimal(110)相比,这可能更清楚地表达了您的意思。

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

j2 = j^0b0110;