Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将字符串转换为0和1,将0和1转换为字符串的有效方法?_Javascript_Performance_Binary - Fatal编程技术网

Javascript 将字符串转换为0和1,将0和1转换为字符串的有效方法?

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

我正在用纯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);
}
函数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))
    })
}