C 两个二进制数的异或问题
我有一个从0到16的数字列表,我想用0110对它们的二进制形式进行异或运算 我把数字放在int j中,然后通过一个循环到达每一个。下面是我的代码行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
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
前缀的二进制(基数2)-仅受某些C编译器支持0b
-使用026
前缀指定八进制(基数8)0
-指定带“no”前缀的十进制(以10为基数)22
-使用0x16
前缀指定十六进制(以16为基数)0x
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;