为什么按位和在javascript中为操作0b0010提供零&;0B0011001110011

为什么按位和在javascript中为操作0b0010提供零&;0B0011001110011,javascript,binary,Javascript,Binary,我不明白为什么结果0b0010&0B0011001011在javascript中是0,预期结果是0b0010,在十进制中是2 谢谢。因为第二个数字太长,类型无法包含。在您的示例中,其工作长度如下: 0b0010和0B0011001110011 因为第二个数字太长,类型无法包含,所以0011的迭代次数比您使用的测试次数短了3次。在您的示例中,其工作长度如下: 0b0010和0B0011001110011 这是0011的3次迭代,比您使用的测试时间短相关数字无法准确表示: console.log(

我不明白为什么结果
0b0010&0B0011001011
在javascript中是0,预期结果是
0b0010
,在十进制中是
2


谢谢。

因为第二个数字太长,类型无法包含。在您的示例中,其工作长度如下:

0b0010和0B0011001110011


因为第二个数字太长,类型无法包含,所以0011的迭代次数比您使用的测试次数短了3次。在您的示例中,其工作长度如下:

0b0010和0B0011001110011


这是0011的3次迭代,比您使用的测试时间短

相关数字无法准确表示:


console.log(编号(“0B0011001110011”).toString(2))问题中的数字无法准确表示:


console.log(编号(“0B0011001110011”).toString(2))TL;DR在此给出的实际建议是,JavaScript中的逐位限制为32位有符号整数,因此您不应该尝试对长度超过31位的整数进行操作。但如果这并不令人满意,请继续阅读,了解到底是什么导致了这种特殊行为

在探索这种行为的确切机制之前,有两件事值得了解:

1.二进制不是二进制 二进制表示法
0b
是一个数值整数文本,与
0x
一样,它不是原始二进制数据文本。其含义是:它仅被解释为一个数字,而定义的变量类型将决定实际的底层位格式(即float vs int)。这一点的意义在于,不同的类型在其极限范围内表现出不同的行为,例如当定义的数字太大或太精确而无法拟合时

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

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

与整数不同,当被分配一个太长而无法完全表示的数字时,浮点总是保留最高有效位,而不是屏蔽它们。它这样做是因为它在数字上更有效,它可以这样做是因为它将数字的数量级分别存储在指数中,这允许它移动数字,使其最高有效位适合52位有效位窗口,并对较低的位进行四舍五入

。。。别跑了!我有图表

因此,在这个不必要的详细图表中,是数字二进制文字输入的完整过程,它转换为64位浮点(并损失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
MSB(隐式1)
│                                                             

+001100110011TL;DR在此给出的实际建议是,JavaScript中的逐位限制为32位有符号整数,因此您不应该尝试对长度超过31位的整数进行操作。但如果这并不令人满意,请继续阅读,了解到底是什么导致了这种特殊行为

在探索这种行为的确切机制之前,有两件事值得了解:

1.二进制不是二进制 二进制表示法
0b
是一个数值整数文本,与
0x
一样,它不是原始二进制数据文本。其含义是:它仅被解释为一个数字,而定义的变量类型将决定实际的底层位格式(即float vs int)。这一点的意义在于,不同的类型在其极限范围内表现出不同的行为,例如当定义的数字太大或太精确而无法拟合时

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

JavaScript按位超过53位 当坚持32位有符号整数(带符号的31位整数)的限制时,按位操作将完全按照预期工作,当超过31位时,31位以上的位将丢失,就像在任何其他语言中一样。直到你推过第53位。。。然后,您可以预期一些不太明显的行为,因为超过此限制后,浮点格式将开始干涉