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

C 两个二进制数的异或问题,c,binary,decimal,xor,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

我有一个从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;
}

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

相反,传递参数中的“110”。Yo将得到预期结果。

在C中,任何前缀为
0
的“数字”都将被解释为八进制

以下是常见的数字前缀:

  • 0b10110
    -指定带有
    0b
    前缀的二进制(基数2)-仅受某些C编译器支持
  • 026
    -使用
    0
    前缀指定八进制(基数8)
  • 22
    -指定带“no”前缀的十进制(以10为基数)
  • 0x16
    -使用
    0x
    前缀指定十六进制(以16为基数)
上述所有示例都是相等的(
22
十进制/以10为基数)

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

尝试:

或者(如果编译器支持):


这是一个清晰、简洁且切中要害的数字。

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

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

j2 = j^0b0110;

但是,当我将代码更改为j2=j^6时;它起作用了。。。有什么区别?见八进制表示法。不要使用
pow(2,i)
。替换为
1L请张贴一个。包括提供的确切输入和输出(如果有)。当72作为参数传递时,binaryToDecimal将按如下方式计算其二进制等价物:-7*2^1+2*2^0=14+2=16
j2 = j ^ 0b0110;
j2 = j^0b0110;