两个二进制数的异或运算出现问题

3

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

然而,当我将代码更改为 j2 = j^6; 它就可以工作了... 有什么区别吗? - Raycherr
3
请查看八进制表示法。https://dev59.com/DFzUa4cB1Zd3GeqP1kUI#7782755 - B. Wolf
2
不要使用 pow(2, i),请改用 1L << i - phuclv
请发布一个 MCVE。如果有的话,请包括精确的输入和输出。 - M.M
3个回答

4

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

相反,传递"110"作为参数。你将得到期望的结果。


2
当72作为参数传递时,binaryToDecimal函数计算其二进制等价物如下: 72^1+22^0 = 14 + 2 = 16 - Parvinder Singh

0

在 C 语言中,任何以 0 为前缀的 '数字' 都会被解释为八进制。

以下是常见的数字前缀:

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

上述所有示例都相等(十进制 / 基数为10 的情况下为 22)。

迄今为止,我更喜欢您熟悉十六进制的方法。这将完全消除您对“将二进制转换为 x”的函数的依赖,以及该函数中的任何实现错误。

尝试一下:

j2 = j ^ 0x06;

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

j2 = j ^ 0b0110;

这很清晰、简洁且直截了当。


0

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

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

j2 = j^0b0110;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接