作为项目的一部分,我有一串介于 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
请注意第二个字符串中的额外零。现在,我对位操作不熟悉,这是我的第一次尝试,但我四处搜索并阅读了我能找到的关于这个主题的文章,我试图在一张纸上写下随着循环的进展,比特的状态试图理解发生了什么,但我似乎无法弄清楚它为什么会出错以及那些额外的零在那里做了什么。要么我的string->bitfield
功能关闭,要么关闭另一个,或者很可能两者兼而有之。但我真的想不通,所以有人对我如何解决任何问题有什么建议吗?
提前致谢!