@yangfch3
2017-10-28T12:46:29.000000Z
字数 1334
阅读 2091
JavaScript
一个实例备忘 JavaScript 的数码系统
const buf = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]);
console.log(buf);
// <Buffer 01 02 03 04 05 06 07 08>
↓
底层存储:
00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000
...
↓
↓ buf.readDoubleBE()
↓
符号位 偏移量 定点部分(52位)
0 00000010000 00100000001100000100000001010000...
↓
定点部分转小数:0.2514725105728566
let str = '0010000000110000010000000101000001100000011100001000';
let total = str.split('').reduce(function (sum, value, index, arr) {
sum = sum + value * Math.pow(0.5, index + 1);
return sum;
}, 0);
console.log(total); // 0.2514725105728566
↓
位移量转指数:
位移量转 10 进制:00000010000 -> 16
2^10 - 1 + x = 16
=> x = -1007
↓
最终结果:(0.2514725105728566 + 1) * 2^-1007
= 8.20788039913184e-304
...
↓
↓ buf.readDoubleLE()
↓
符号位 偏移量 定点部分(52位)
0 00010000000 11100000110000001010000010...
↓
定点部分转小数:0.4389696270665129
let str = '0111000001100000010100000100000000110000001000000001';
let total = str.split('').reduce(function (sum, value, index, arr) {
sum = sum + value * Math.pow(0.5, index + 1);
return sum;
}, 0);
console.log(total); // 0.4389696270665129
↓
位移量转指数:
位移量转 10 进制:00010000000 -> 128
2^10 - 1 + x = 128
=> x = -895
↓
最终结果:(0.4389696270665129 + 1) * 2^-895
= 5.447603722011605e-270
const buf = Buffer.allocUnsafe(8);
buf.writeDoubleBE(5);
↓
5 的二进制表示:101
=> 1.01 * 2^2
↓
64 位双进度表示:0010000000010100000000...
符号位 偏移量 定点部分
0 2^10 - 1 + 2 0100000000...
每个字节表示成 16 进制:40 14 00 00 00 00 00 00
↓
↓ 大端写入
↓
<Buffer 40, 14, 00, 00, 00, 00, 00, 00>
与大端写入转换相近,只是写入时使用的是小端写入。