javascript 按位 64 位实现
javascript bitwise 64 bit implementation
在javascript中,我们无法在按位运算中计算大于 32 位的值。但是在 c# 中我们可以做到这一点。
这是示例 如果我们尝试 运行 下面的一个浏览器控制台
4294967296 & 8589934591
它的 returns 0 但在 C# 中它的 returns 4294967296
我用谷歌搜索,发现我们可以使用这个 goog.math.Long 来实现大于 32 位的实现。
但我的问题是,我找不到在客户端实现逻辑的示例。
谁能帮我解决这个问题。
提前致谢
我觉得你真的不需要 goog.math.long ?
足以将其转换为字符串,进行拆分。然后进行AND运算并重组:
var a = 8589934592;
var str = a.toString()
var subNumber1 = parseInt(str.slice(0, str.length - 5));
var subNumber2 = parseInt(str.slice(str.length - 5));
var res1 = (subNumber1 & subNumber1).toString();
var res2 = (subNumber2 & subNumber2).toString();
var res = parseInt(res1.concat(res2));
console.log(res);
我不确定这是否是您要查找的内容,但如果您将 google/closure-library 与 npm 一起使用。您可以使用 Browserify or Webpack 将模块捆绑到客户端。
我从这个 URL 得到了线索,但没有使用 goog.math.Long。
How to do bitwise AND in javascript on variables that are longer than 32 bit?
这是一个有趣的任意大整数函数:
function BitwiseAndLarge(val1, val2) {
var shift = 0, result = 0;
var mask = ~((~0) << 30); // Gives us a bit mask like 01111..1 (30 ones)
var divisor = 1 << 30; // To work with the bit mask, we need to clear bits at a time
while( (val1 != 0) && (val2 != 0) ) {
var rs = (mask & val1) & (mask & val2);
val1 = Math.floor(val1 / divisor); // val1 >>> 30
val2 = Math.floor(val2 / divisor); // val2 >>> 30
for(var i = shift++; i--;) {
rs *= divisor; // rs << 30
}
result += rs;
}
return result;
}
假设系统能正确处理至少 30 位的按位运算。
javascript bitwise 64 bit implementation using goog.math.Long
- 添加Js库http://www.hobsonassoc.com/scripts/closure/goog/docs/closure_goog_math_long.js.source.html
- 评论js库中的
// goog.provide('goog.math.Long')
- 在js库中添加
var goog = {}; goog.math = {};
- 调用函数
var val1 = goog.math.Long.fromString("4611686018427387904");
示例如下:
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>Bitmask 64 Bit</title>
<script type="text/javascript" src="goog.math.long.js"></script>
<script type="text/javascript">
var val1 = goog.math.Long.fromString("4611686018427387904"); // 2^62
var val2 = goog.math.Long.fromString("6917529027641081856"); // 2^61 | 2^62
var val3 = goog.math.Long.fromString("2305843009213693952"); // 2^61
var val4 = goog.math.Long.fromString("4611686018427387904"); // 2^62
document.writeln(val1.and(val2)); // 2^62 & (2^61 | 2^62)
document.writeln(val3.or(val4)); // 2^61 | 2^62
</script>
</head>
<body>
</body>
</html>
使用此库需要许可证。
在javascript中,我们无法在按位运算中计算大于 32 位的值。但是在 c# 中我们可以做到这一点。
这是示例 如果我们尝试 运行 下面的一个浏览器控制台
4294967296 & 8589934591
它的 returns 0 但在 C# 中它的 returns 4294967296
我用谷歌搜索,发现我们可以使用这个 goog.math.Long 来实现大于 32 位的实现。
但我的问题是,我找不到在客户端实现逻辑的示例。
谁能帮我解决这个问题。
提前致谢
我觉得你真的不需要 goog.math.long ? 足以将其转换为字符串,进行拆分。然后进行AND运算并重组:
var a = 8589934592;
var str = a.toString()
var subNumber1 = parseInt(str.slice(0, str.length - 5));
var subNumber2 = parseInt(str.slice(str.length - 5));
var res1 = (subNumber1 & subNumber1).toString();
var res2 = (subNumber2 & subNumber2).toString();
var res = parseInt(res1.concat(res2));
console.log(res);
我不确定这是否是您要查找的内容,但如果您将 google/closure-library 与 npm 一起使用。您可以使用 Browserify or Webpack 将模块捆绑到客户端。
我从这个 URL 得到了线索,但没有使用 goog.math.Long。
How to do bitwise AND in javascript on variables that are longer than 32 bit?
这是一个有趣的任意大整数函数:
function BitwiseAndLarge(val1, val2) {
var shift = 0, result = 0;
var mask = ~((~0) << 30); // Gives us a bit mask like 01111..1 (30 ones)
var divisor = 1 << 30; // To work with the bit mask, we need to clear bits at a time
while( (val1 != 0) && (val2 != 0) ) {
var rs = (mask & val1) & (mask & val2);
val1 = Math.floor(val1 / divisor); // val1 >>> 30
val2 = Math.floor(val2 / divisor); // val2 >>> 30
for(var i = shift++; i--;) {
rs *= divisor; // rs << 30
}
result += rs;
}
return result;
}
假设系统能正确处理至少 30 位的按位运算。
javascript bitwise 64 bit implementation using goog.math.Long
- 添加Js库http://www.hobsonassoc.com/scripts/closure/goog/docs/closure_goog_math_long.js.source.html
- 评论js库中的
// goog.provide('goog.math.Long')
- 在js库中添加
var goog = {}; goog.math = {};
- 调用函数
var val1 = goog.math.Long.fromString("4611686018427387904");
示例如下:
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>Bitmask 64 Bit</title>
<script type="text/javascript" src="goog.math.long.js"></script>
<script type="text/javascript">
var val1 = goog.math.Long.fromString("4611686018427387904"); // 2^62
var val2 = goog.math.Long.fromString("6917529027641081856"); // 2^61 | 2^62
var val3 = goog.math.Long.fromString("2305843009213693952"); // 2^61
var val4 = goog.math.Long.fromString("4611686018427387904"); // 2^62
document.writeln(val1.and(val2)); // 2^62 & (2^61 | 2^62)
document.writeln(val3.or(val4)); // 2^61 | 2^62
</script>
</head>
<body>
</body>
</html>
使用此库需要许可证。