前端应掌握的二进制知识

280 阅读2分钟

前置

  • 1表示负数
  • 0表示正数
    • 十进制数,转二进制 ,先拿这个数除以二取余,然后不断拿上一次的商除以2,直到为0, 收集每次的余数,最后得到的余数最高位,就是二进制表示的数
    • eg: 9/2 商4余1 -> 4/2 商2余0 -> 2/2 商1余0 -> 1/2 商0余1
    • 从右到左连起来 1001 -> 符号位带上 0 1001
那么-9在计算机里分别怎么表示的
练习: 9 ->  0 1001
      -9 ->  1 0111
  • -9为什么是1 0111? 这是因为计算机里使用的是补码表示数字,好处是硬件只需要有累加器就好了。
  • 那么负数的补码怎么算:
对于正数,就是按照上面写的方法,直接转得出 01001 (我们称之为原码),因为正数的补码跟原码一致。
对于负数,这个负数对应的正数的基础上,包括符号位在内按位取反(得出反码), 然后+1.

eg: -9 
-> 先写出正9(01001)(我们称之为原码)
-> 按位取反(10110)(我们称之为反码)
-> 然后+1 -> 10111(这就是答案,补码)

试试9+(-9)

包括符号位在内纳入计算

   0 1001
+  1 0111
----------
 1 0 0000   
 
 从右往左看: 
 1+1 有进位
 0+1 因为上一位有进位,所以变成了 1+1, 继续进位。
 ... 跟十进制一样的道理,就不每一位分析了
 
 最后发现比原来多出了一位,我们舍去(溢出的位自然也是管不了的), 答案就是 0 0000,刚好~

十进制小数转二进制

  • 不断乘以2,拿出整数部分,剩下的小数部分,继续上面的乘以2操作。最先得到的整数最高位
举个例子就好

eg: 0.75 -> 0.75 * 2 = 1.5 拿出10.5->  0.5 * 2 = 1.0 停止,因为小数位到0-> 答案 0.11

说清楚老生常谈的0.1+0.2 != 0.3

因为十进制0.1,0.2,0.3换算成二进制,刚好是无限循环的,就跟十进制1/3=0.33333333333一个道理,js个数是64位,无限循环肯定存不完的。这里我取前10位,做例子

  0.1 -> 0.0100110110
  0.2 -> 0.0011001100
+
----------------------
         0.0100110110
         
而我们直接用上面讲的方法,讲0.3换算成二进制(因为无限循环,我取前面10来位意思一下)
0.3 -> 0.0100110011

我们发现 0.0100110110 !== 0.0100110011

js里采用IEEE754标准,js采用双精度(64位),浮点数如何表示呢:符号位(第1位)+指数位(2-12位)+小数有效位(13-64位) (可忽略)

  • (3.5)10=(11.1)2=1.1121(3.5)_{10} = (11.1)_{2} = 1.11 * 2^1 image.png 这个标准有效为第一位默认是1,可能是这个标准,浮点数一定得大于1吧,指数位也可以是负

题目js大数相加