繁体   English   中英

如何在没有字符串的情况下操作 Javascript 中的第 52-32 位?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM