0

我在 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 上?

4

2 回答 2

1

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

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

第一个示例之所以有效,是因为十进制的 1 与二进制的 1 相同。结果是 100(十进制),而不是 4。Javascript 不会在内部存储数字格式。

于 2017-07-08T20:56:19.340 回答
1

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

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

对字符串中表示的二进制值进行操作,您必须首先将值转换为以 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。

于 2017-07-08T20:47:43.693 回答