プロジェクトの一環として、0から3までの数字の文字列があります。例:
2030000000000000000030000000000000000003333212111221121301
この文字列をURLに渡したいので、各数値はそれぞれ最大2ビットしか使用しないため、ビットフィールドを使用してみることができると考えました。このような文字列をデータのビットフィールドとして使用される整数の配列との間で変換するために、クラスで次の関数を作成しました。
makeBuildBitfield: function(build) {
var b = build.split('');
var f = [3, 0]; // the "3" is there for future purposes
var i = 1;
var j = 0;
for (var t in b) {
if (j < 14) {
f[i] |= b[t];
f[i] = f[i] << 2;
++j;
} else {
f[i] |= b[t];
++i;
f[i] = 0;
j = 0;
}
}
return f.join('.');
},
getBuildFromBitfield: function(bitfield) {
b = bitfield.split('.');
var ba = [];
for (var x = 1; x < b.length; ++x) { //start from 1 to skip the "3"
ba[x] = [];
var n = b[x];
for (var y = 14; y >= 0; --y) {
ba[x][y] = n & 3;
n = n >>> 2;
}
}
build = '';
for (var a in ba) build += ba[a].join('');
return build;
},
それらは機能しているように見えますが...完全ではありません。最初に例の文字列を渡すと、次のようになります。
2030000000000000000030000000000000000003333212111221121301
次の出力が得られます。
3.587202560.786432.4089.156916164
ただし、これを元に戻すことになっている関数に渡すと、次のようになります。
203000000000000000003000000000000000000333321021112211213010
2番目の文字列の余分なゼロに注意してください。今、私はビットを操作するのは初めてで、これは初めての試みですが、このテーマについて見つけた記事を探して読んだり、紙に書き留めたりしようとしました。ループが進行するときのビットの状態は、何が起こっているのかを理解しようとしますが、なぜそれがうまくいかないのか、そしてそれらの余分なゼロがそこで何をしているのか理解できないようです。私のstring->bitfield
機能がオフになっているか、他の機能がオフになっているか、あるいはその両方である可能性があります。しかし、私は本当にそれを理解することができないので、それがうまくいかないことが何であれ、私がどのように修正できるかについて誰かが何か提案がありますか?
前もって感謝します!