gpt4 book ai didi

javascript - 为什么按位与在JavaScript中运算0b0010&0b0011001100110011001100110011001100110011001100110011001100110011时给出零

转载 作者:行者123 更新时间:2023-11-28 14:31:10 29 4
gpt4 key购买 nike

我不明白为什么JavaScript中的结果0b0010&0b0011001100110011001100110011001100110011001100110011001100110011为0,预期结果为0b0010,即2以十进制表示。

谢谢。

最佳答案

这里要提的实用建议是,JavaScript 中的按位仅限于 32 位有符号整数,因此您不应尝试对长度超过 31 位的整数进行操作。但如果这不能令人满意,请继续阅读以了解究竟是什么导致了这种特定行为......

在尝试了解这种行为的确切机制之前,有几件事值得理解:

1。二进制不是二进制

二进制表示法0b是一个数字整数文字,就像0x一样,它不是原始二进制数据文字。含义是:它仅被解释为数字,而定义的变量的类型将确定实际的基础位格式(即浮点与整数)。这样做的重要性在于,不同类型在其极限下表现出不同的行为,例如当定义太大或精度太高而无法适应时。

2。按位用于整数

JavaScript 数字是 64 位 float ,又称为“ double ”,但按位运算仅对整数有效。这是因为 int 位格式本质上与二进制数字文字相同;而 float 则非常不同,它们将数字分为指数和有效数。为了解决这个问题,JavaScript 在执行按位运算之前将数字转换为 32 位有符号整数(可以在 64 位浮点中完全表示)。

JavaScript 按位超过 53 位

当坚持 32 位有符号整数(带符号的 31 位整数)的限制时,按位运算将完全按照预期工作,并且当超过 31 位时,您可以预期 31 以上的位会丢失,就像以任何其他语言。直到您超过第 53 位...然后您可以期待一些不太明显的行为,因为超过此限制浮点格式开始干扰它(而不仅仅是屏蔽高位):

与整数不同,当分配的数字太长而无法完全表示时, float 始终保留最高有效位,而不是屏蔽它们。它这样做是因为它在数字上更有效,并且它可以这样做是因为它将数字的数量级单独存储在指数中,这允许它移动数字以便其最高有效位适合 52 位有效数窗口并四舍五入较低位。

...先别跑!我有图表!

因此,在这个不必要的详细图表中,您可以看到数字二进制文字输入的完整过程:转换为 64 位 float (并损失 9 位精度),然后转换为 32 位有符号整数。请注意,这纯粹是概念性的,并不代表实际机制。

    MSB (implicit 1)                                              

+0011001100110011001100110011001100110011001100110011001100110011 <─ num
│ └────────────────────────┬─────────────────────────┘└───┐
│ │ round
│ │ carry
│ 1001100110011001100110011001100110011001100110011010 <──┘
sign └──────────────────────┐ │
│ 1084 = (2^10 - 1) + 61 │
│ │ │
│ │ [ 11-bit exponent ] │ [ 52-bit significand ]
│┌────┴────┐┌────────────────────────┴─────────────────────────┐
0100001111001001100110011001100110011001100110011001100110011010 <─ f64
│└────┬────┘└────────────────────────┬─────────────────────────┘
│ │ │
│ │ │
│ 1084 - (2^10 - 1) = 61 ────────────── 61 - 52 = 9 ───┐
sign │ shift
│ 1001100110011001100110011001100110011001100110011010 <──┘
│ │
│ │
│ ┌────────────────────────┴─────────────────────────┐
+0011001100110011001100110011001100110011001100110011010000000000 <─ num
│ │ └──────────────┬──────────────┘
│ MSB (implicit 1) │
│ │
│ │
└───────────── sign ─────────────┐ truncate
│ │
│ │
│ │
│┌──────────────┴──────────────┐
00110011001100110011010000000000 <─ s32

请注意,输入中的最高有效数字位于第 62 位,比 64 位 float 可表示的最大有效数 (53) 高出 9,这导致输出中的最低位置数字正好为 9归零,(第 9 个四舍五入并进位)。

关于javascript - 为什么按位与在JavaScript中运算0b0010&0b0011001100110011001100110011001100110011001100110011001100110011时给出零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51519364/

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