我有一个从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;
这是清晰,简洁和中肯的。