【问题标题】:How to manipulate bits 52-32 in Javascript, without strings?如何在没有字符串的情况下操作 Javascript 中的 52-32 位?
【发布时间】:2020-10-14 11:04:33
【问题描述】:

我有以下工作原型代码:

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 位整数,使其无用。)

【问题讨论】:

标签: javascript integer bit-manipulation bit


【解决方案1】:

只是忽略符号并让符号通过。使用除法并转换为 32 位整数以获得高位,并使用模数获得低位。

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

【讨论】:

    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2017-06-04
    • 2019-02-20
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多