Javascript 将字符串转换为0和1,将0和1转换为字符串的有效方法?
我正在用纯JavaScript编写一个位流实现。我目前将位表示为“0”和“1”的字符串-我认为这比0和1的数组更有效,我不想使用Uint32-我需要将字符串转换为该表示形式,并从中转换。以下是我目前得到的信息:Javascript 将字符串转换为0和1,将0和1转换为字符串的有效方法?,javascript,performance,binary,Javascript,Performance,Binary,我正在用纯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
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);
}
函数uintToBitString(uint,位长度){
var res=单元至串(2);
if(分辨率长度>位长度){
抛出新错误(“数字“+uint+”太大,无法放入”+
位长度+位“);
}
if(分辨率长度<位长度){
res=数组(位长度-res.length+1)。连接(“0”)+res;
}
返回res;
}
函数stringToBinRep(val){
变量位_个数=[];
对于(变量i=0;i
虽然我熟悉JavaScript,但我并不十分精通如何让代码更快,而不是让代码更慢。是否有更有效的方法仅使用纯JavaScript实现上述功能?在
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);
}
也就是说,如果性能真的很重要,那么应该使用int进行位操作,而不是1/0字符串。字符串不是作为字符数组实现的吗?@davintroon:可能是的。但是呢?我必须能够读/写
n
位,其中n%8!==0
。这只是我正在编写的比特流协议的一部分。我只是想知道你关于在数组上使用字符串更有效的评论。我不是一个真正的js爱好者,但我已经看过一些关于字符串concat比array.join等性能更好的文章。您使用返回string.fromCharCode.apply(string,charCodes)
而不是返回string.fromCharCode(charCodes)
?@fardjad:Yep,string.fromCharCode(charCodes)
不起作用。请尝试下列操作:String.fromCharCode(60,60,70)
,String.fromCharCode([60,60,70])
,String.fromCharCode.apply(String[60,60,70])
。很好!不会想到的谢谢。替换变体。我将试用它们&看看性能如何比较。你说得对,我真的应该使用比特操作。我来看看这对我的工作是否有必要。那么在这种情况下,我要处理32位整数的数组?(所以我只需要4个字节来表示32位,而不是32个字节)是的,就是这样。注意这个角色!=字节,如果处理unicode字符串。
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))
})
}