gpt4 book ai didi

javascript - 按位 AND OR 和 XOR 如何处理 -negative 有符号整数?

转载 作者:行者123 更新时间:2023-12-02 17:01:37 25 4
gpt4 key购买 nike

我只是在解决关于位运算符 的随机问题,并尝试各种其他组合来做个人笔记。不知何故,我就是想不出解决办法。

假设我想检查两个整数之间的按位与或 ~number 和 -negative number(~num1 & -num2) 以及各种其他组合。然后我可以看到答案,但我无法确定这是怎么发生的?

控制台:

console.log(25 & 3); outputs 1 (I can solve this easily).

console.log(-25 & -3); outputs-27.

同理

console.log(~25 & ~3); outputs -28.

console.log(25 & ~3); outputs -24.

console.log(~25 & 3); outputs -2.

console.log(~25 & -3); outputs --28.

console.log(-25 & ~3); outputs --28.

我知道“console.log(25 & -3)”背后的逻辑。

25 is 11001
-3 is 11101(3=00011 The minus sign is like 2s compliment+1)
AND-11001 = 25.

但是当两个数字都是负数或上面提到的其他情况时,我不能让它以同样的方式工作。我也尝试过各种数字组合,而不仅仅是这两个。但我无法解决问题。谁能解释一下我无法解决的问题中使用的二进制逻辑。

(我在这里花了大约 2 个小时在 SO 上找到答案,又在谷歌上花了 1 个小时以上,但我仍然没有找到答案)。

感谢和问候。

最佳答案

JavaScript 指定对整数执行按位运算,就像它们存储在补码符号中一样。幸运的是,如今大多数计算机硬件本身都使用这种表示法。

为了简洁起见,我将以下数字显示为 8 位二进制。它们在 JavaScript 中实际上是 32 位的,但对于原始问题中的数字,这不会改变结果。但是,它确实让我们放弃了很多前导位。

console.log(-25 & -3); //outputs -27. How?

如果我们将整数写成二进制,我们将分别得到 (11100111 & 11111101)。将它们加在一起得到 11100101,即 -27。

在后面的示例中,您似乎交替使用 NOT 运算符 (~) 和否定 (-)。你不能用二进制补码来做到这一点:~ 和 - 不是一回事。 ~25 是 11100110,也就是 -26,不是 -25。同样,~3 是 11111100,即 -4,而不是 -3。

但是当我们将这些放在一起时,我们可以计算出您提供的示例。

console.log(~25 & ~3); //outputs-28. How?

11100110 & 11111100 = 11100100,即 -28(不是你写的 28)

console.log(25 & ~3);//outputs-24. How?

00011001 & 11111100 = 00011000, 即 24

console.log(~25 & 3);//outputs-2. How?

11100110 & 00000011 = 00000001,即 2

console.log(~25 & -3);//outputs--28. How?

11100110 & 11111101 = 11100100, 即 -28

console.log(-25 & ~3);//outputs--28. How?

11100111 & 11111100 = 11100100, 即-28

理解这一点的真正关键是您实际上并没有对整数使用按位运算。您将它们用于特定大小的比特袋,而这些比特袋恰好可以方便地表示为整数。这是了解此处发生的事情的关键,因为您偶然发现了差异很重要的情况。

在计算机科学中有一些特定情况,您可以以巧合的方式操作比特包,得到与对数字进行特定数学运算相同的结果。但这仅在特定情况下有效,并且它们要求您对正在处理的数字做出某些假设,如果您的数字符合这些假设,事情就会崩溃。

这就是 Donald Knuth 所说“过早的优化是万恶之源”的原因之一。如果您想使用按位运算代替实际的整数数学运算,您必须绝对确定您的输入实际上会遵循该技巧起作用所需的假设。否则,当您开始使用这些假设之外的输入时,结果会开始看起来很奇怪。

关于javascript - 按位 AND OR 和 XOR 如何处理 -negative 有符号整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53950063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com