我在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?
答案 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不会在内部存储数字格式。