我正在用纯JavaScript编写比特流实现。我目前将位表示为“0”和“1”的字符串 - 认为这比0和1的数组更有效,我不想使用Uint32 - 我需要将字符串转换为此字符串表示。这是我到目前为止所得到的:
function uintToBitString(uint, bit_length) {
var res = uint.toString(2);
if (res.length > bit_length) {
throw new Error("The number " + uint + " is too big to fit in " +
bit_length + " bits");
}
if (res.length < bit_length) {
res = Array(bit_length - res.length + 1).join("0") + res;
}
return res;
}
function stringToBinRep(val) {
var bit_pieces = [];
for (var i=0; i < val.length; i++) {
bit_pieces[i] = uintToBitString(val.charCodeAt(i), 8);
}
return bit_pieces.join("");
}
function binRepToString(bits) {
var charCodes = [];
for (var i=0; i < bits.length; i += 8) {
charCodes[i / 8] = parseInt(bits.slice(i, i+8), 2);
}
return String.fromCharCode.apply(String, charCodes);
}
虽然我熟悉JavaScript,但我不太了解更快的代码和更慢的代码。有没有一种更有效的方法来使用纯JavaScript进行上述操作?
答案 0 :(得分:2)
uintToBitString
的明显改善就像
function uintToBitString(uint, bit_length) {
var max = 1 << bit_length;
if(uint >= max)
throw new Error("The number " + uint + " is too big to fit in " +
bit_length + " bits");
return (uint | max).toString(2).substring(1);
}
至于其他两个人,我宁愿在那里使用String.replace
:
function stringToBinRep(val) {
return val.replace(/./g, function($0) {
return uintToBitString($0.charCodeAt(0), 8)
})
}
function binRepToString(bits) {
return bits.replace(/.{8}/g, function($0) {
return String.fromCharCode(parseInt($0, 2))
})
}
也就是说,如果性能真的很重要,你应该使用int来进行位操作而不是1/0字符串。