【发布时间】:2016-01-04 00:45:43
【问题描述】:
我希望将 JavaScript 数字的 MIN_SAFE_INTEGER 到 MAX_SAFE_INTEGER 范围(不包括符号的 53 位)转换为分布在 7 个字节上的位串,移位两个以允许符号和空标识符。
到目前为止,我想出的最好的是:
function toUint8Array(data) {
data = data.toString(2);
data = new Array(65 - data.length).join('0') + data;
var ret = new Uint8Array(data.length / 8);
for (var i = 0; i < 8; i++) {
ret[i] = 0;
ret[i] += (data[i * 8] == '1' ? 128 : 0);
ret[i] += (data[(i * 8) + 1] == '1' ? 64 : 0);
ret[i] += (data[(i * 8) + 2] == '1' ? 32 : 0);
ret[i] += (data[(i * 8) + 3] == '1' ? 16 : 0);
ret[i] += (data[(i * 8) + 4] == '1' ? 8 : 0);
ret[i] += (data[(i * 8) + 5] == '1' ? 4 : 0);
ret[i] += (data[(i * 8) + 6] == '1' ? 2 : 0);
ret[i] += (data[(i * 8) + 7] == '1' ? 1 : 0);
}
return (ret);
}
如您所知,这将非常缓慢(并且在所有 7 个活动字节中,这些位仍未移动两位。)
有什么方法可以更快地做到这一点?理想情况下完全避免字符串解析?
【问题讨论】:
-
实际上 DataView,正确使用,即不是您尝试过的方式,可以提供适度的(Firefox 中为 3X,Chrome 中为 1.5X,7.5X b> 在 Internet Explorer 中)速度提高 - 我可能做得不够理想
-
@JaromandaX 我很想知道您是如何管理它以产生我想要获得的输出的。
-
我可以做一个小提琴,但是......输入严格限制为 MIN_SAFE_INTEGER -> MAX_SAFE_INTEGER - 一个问题......符号/空位应该是第 7 个字节的 LSB 还是 MSB第一个字节?
-
@JaromandaX 符号位是第一个字节的第 1 位,空位是第一个字节 like in this fiddle that only goes to 32 bits 的第 2 位。我实际上对
MAX_SAFE_INTEGER允许的 53 位非常满意,因为我使用的是bignumber.js,除此之外,我真的很想避免对33位进行字符串解析,尽管53如果可能的话。
标签: javascript numbers bitmask