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

Posted

技术标签:

【中文标题】如何在没有字符串的情况下操作 Javascript 中的 52-32 位?【英文标题】:How to manipulate bits 52-32 in Javascript, without strings? 【发布时间】: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 位整数,使其无用。)

【问题讨论】:

想法:1) 看看WebAssembly 是否有帮助(它是well supported),2) 看看dcodeIO 的long.js 是如何工作的。 u64/(1 【参考方案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

【讨论】:

以上是关于如何在没有字符串的情况下操作 Javascript 中的 52-32 位?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 JavaScript 的情况下设计可扩展的 HTML 表单?

如何在没有 Blazor Web 组件的情况下从 JavaScript 使用 C# WebAssemly

我们如何在不重新加载页面的情况下使用 javascript/jQuery 更新 URL 或查询字符串?

jQuery/Javascript 在没有插件的情况下检测操作系统?

JavaScript学习系列博客_5_JavaScript中的运算符(操作符)

如何在没有 Javascript 的情况下将焦点设置到页面顶部?