如何在没有字符串的情况下操作 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 在没有插件的情况下检测操作系统?