[英]How to manipulate bits 52-32 in Javascript, without strings?
我有以下工作原型代码:
function int2str(int, bits) {
const str = int.toString(2);
var ret = '';
for (var i = 0; i < (bits - str.length); ++i) {
ret += '0';
}
ret += str;
return ret;
}
function high32(u64) {
return parseInt(int2str(u64, 64).substr(0, 32), 2);
}
function low32(u64) {
return parseInt(int2str(u64, 64).substr(32, 32), 2);
}
function combine(low, high) {
return parseInt(int2str(high, 32) + int2str(low, 32), 2);
}
我可以在没有字符串的情况下更有效地做到这一点吗?
(Javascript 中的位运算符转换为 32 位 integer,使它们无用。)
只是忽略标志并让标志通过。 使用除法并转换为 32 位 integer 获得高位,模数获得低位。
const POW2_32 = (1<<16)*(1<<16) function high32(u64) { return (u64/POW2_32)|0 } function low32(u64) { return u64%POW2_32 } function combine(low, high) { return high * POW2_32 + low }
如果您想接受签名号码:
function high32(u64) { return (u64/((1<<16)*(1<<16))) } function low32(u64) { return Math.abs(u64%((1<<16)*(1<<16))) } function combine(low, high) { return (high<0?-1:1) * // if high32 is neg, whole number is neg (Math.abs(high * POW2_32) + Math.abs(low|((low<0)<<15))) // if low bit is neg, set highest low bit }
此外,如果您需要为高位 Math.trunc 捕获超过 32 位,并且您当然需要更改所有内容以使用 BigInt(因此 1n<<16n 而不是 1<<16)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.