4

純粋な 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 のみを使用して上記を行うより効率的な方法はありますか?

4

1 に答える 1

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);
}

他の2つについては、むしろ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))
    })
}

つまり、パフォーマンスが本当に重要な場合は、ビット操作に 1/0 文字列ではなく int を使用する必要があります。

于 2013-05-02T21:45:16.963 に答える