我有一个从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;
}
答案 0 :(得分:4)
您的代码存在的问题是,当您将“0110”作为参数传递时,编译器会将其视为八进制数,即0110 ==> 72(十进制)。
相反,传递“110”作为参数。哟会得到预期的结果。
答案 1 :(得分:0)
在C中任何' 数字'带有0
前缀的将被解释为八进制。
以下是常见的数字前缀:
0b10110
- 指定二进制(基数2),0b
前缀 - 仅支持某些C编译器 026
- 使用0
前缀22
- 使用' 否'指定小数(基数为10)前缀0x16
- 使用0x
前缀以上所有示例都相同(十进制/基数为22
)。
到目前为止,我的首选方法是让您熟悉十六进制。这将完全消除您对函数的依赖性,以便将二进制转换为x '以及该函数中的任何实现错误。
尝试:
j2 = j ^ 0x06;
或(如果你的编译器支持它):
j2 = j ^ 0b0110;
这是清楚,简明和重点。
答案 2 :(得分:0)
如前所述,0110
是一个八进制数,因此binaryToDecimal(0110)
将无效。您可以使用类似的语法来表达您想要的数字(只要您使用支持C ++ 14或更高版本的编译器)0b0110
。与binaryToDecimal(110)
相比,这可能更清楚地表达了您的意思。
有了这个,你的第一行将被写为
j2 = j^0b0110;