javascript按位xor产生不一致的结果

时间:2017-07-08 20:45:19

标签: javascript binary bitwise-xor

我在javascript中使用按位操作,但我注意到一些看似不一致的内容。

现在,我正在使用XOR(^)操作。当我'0101'^'0001'时,我得到4,这是有意义的,因为4 = 0100二进制。 但当我做'10001'^'01111'时,我得到9030,当我认为我应该得到11110。 就我所能说的而言,格式是相同的;只有字符串不同。

console.log(5^1); //4
console.log('0101'^'0001'); // 100 = 4

console.log(17^15); //30
console.log('10001'^'01111'); //9030...why? shouldn't it be '11110'?

为什么这段代码产生了这个结果?

现在,如果我这样做:

console.log(('0b'+'10001')^('0b' + '01111')); //30

为什么我必须添加'0b'来指定在17和15上执行按位操作时字符串是二进制序列,而不是5和1?

2 个答案:

答案 0 :(得分:1)

您在字符串上使用^运算符。在字符串上使用任何数字运算符时,JavaScript会将字符串隐式转换为数字。添加0b会告诉JavaScript将您的号码视为二进制或基数为2。

否则,默认情况下,它们将转换为十进制或十进制值。

对字符串中表示的二进制值执行操作时,必须先将值转换为数字基2值。

您可以在计算器10,001 ^ 1111 = 9030中验证。

二进制1111 = 15和10001 = 17。 15 ^ 17 = 30,这是二进制的11110。

101 Xor 1是一种特殊情况,在十进制101 Xor 1 = 100中。在二进制101 = 5和5 Xor 1 = 4中,以二进制写出为100。

答案 1 :(得分:1)

正如已经指出的那样,您没有使用二进制数字。使用0b前缀表示二进制数,使用toString(2)表示转换回来:

console.log((0b10001 ^ 0b01111).toString(2));
11110

第一个例子正常工作,因为十进制中的1与二进制中的1相同。结果是100(十进制),但不是4. Javascript不会在内部存储数字格式。