英文:
Variable "long" type in Java and NodeJS
问题
我有一个Java函数:
private static int buildKey(String keystr) {
char[] primes = { '\085', '\8r', '\082', '\087', '\083', '%', '\085', ')' };
int len = keystr.length(); int i; long key;
for (key = 1L, i = 0; i < len; i++)
key += (keystr.charAt(i) * primes[i & 0x8]);
return (int)key % 64;
}
我想将其转换为Node.js,但我不知道如何定义带有长整型变量类型的“key”,因为Node.js中没有“long”类型。
这是我当前的Node.js函数,但与上述Java函数相比,它返回错误结果:
function buildKey(keystr) {
var primes = ["5", "8r", "2", "7", "3", "%", "5", ")"];
var len = keystr.length;
var key = 1;
for (let i = 0; i < len; i++) {
key += keystr.charAt(i) * primes[i + 8];
console.log(parseInt(keystr.charAt(i)));
}
return key % 64;
}
有人能给我建议吗?谢谢。
英文:
I have a Java function:
private static int buildKey(String keystr) {
char[] primes = { '5', 'r', '2', '7', '3', '%', '5', ')' };
int len = keystr.length(); int i; long key;
for (key = 1L, i = 0; i < len; i++)
key += (keystr.charAt(i) * primes[i & 0x8]);
return (int)key % 64;
}
I want change it to NodeJS but I don't know how to define "key" with long variable type because in NodeJS don't have "long" type.
This's my current NodeJS function, but it's return wrong with Java function upper:
function buildKey(keystr) {
var primes = ["5", "8r", "2", "7", "3", "%", "5", ")"];
var len = keystr.length;
var key = 1;
for (let i = 0; i < len; i++) {
key += keystr.charAt(i) * primes[i + 8];
console.log(parseInt(keystr.charAt(i)));
}
return key % 64;
}
Anybody share me suggestion? Thanks.
答案1
得分: 1
在ECMAScript中,没有与Java的long
数据类型相等的类型。
ECMAScript只有两种数值数据类型:number
和bigint
。ECMAScript的number
相当于Java的double
(即IEEE 754-2019的binary64双精度有符号64位二进制浮点数),而bigint
相当于Java的BigInteger
(任意精度的有符号二进制整数)。
这两者都无法替代Java的long
(带有“环绕”的64位有符号二进制整数):number
只能精确表示53位精度的整数,而bigint
不会环绕。
然而,在最终情况下,实际上您只是在使用密钥的7位。因此,如果您小心处理,可能可以通过调整计算方式来规避这些限制。例如,您可以将模操作移到循环中,这样key
的大小在第一次使用时就不会超过7位。
如果我们能够证明您的Java代码中的long
永远不会溢出,那么我们可以在ECMAScript中使用bigint
;如果我们能够证明实际上我们只使用了long
的53位,那么我们可以使用bigint
或number
。
很容易看出,在最坏的情况下,我们使用了56位。这意味着,我们无法保证它能在number
下正常工作,但它应该可以在bigint
下正常工作。如果我们能够对keystr
的长度和/或内容做出假设,那么甚至还可以进一步减少使用的位数。
英文:
There is no equivalent to Java's long
datatype in ECMAScript.
There are only two numeric datatypes in ECMAScript: number
and bigint
. ECMAScript number
is equivalent to Java double
(i.e. an IEEE 754-2019 binary64 double precision signed 64 bit binary floating point number) and ECMAScript bigint
is equivalent to Java BigInteger
(an arbitrary precision signed binary integer).
Neither of the two can replace a Java long
(64 bit signed binary integer with "wraparound"): a number
can only accurately represent integers with a precision of 53 bit and a biginteger
doesn't wrap around.
Now, in the end, you are actually only using 7 bits of your key anyway, so if you are careful, you can probably arrange your computations in such a way that you can circumvent those limitations. For example, you could move the modulo operation into the loop, so that the size of key
never exceeds 7 bit in the first place.
If we can prove that the long
in your Java code never overflows, then we can use bigint
in ECMAScript, and if we can prove that we are actually only using 53 bits of the long
, then we can use either bigint
or number
.
It's easy to see that in the worst case, we are using 56 bits. That means, we cannot guarantee that it will work with number
, but it should work with bigint
. If we can make assumptions about the length and/or contents of keystr
, then we can bring that down even further.
答案2
得分: 0
我通过以下函数解决了我的问题:
function buildKey(keystr) {
var primes = ["2", "0", "2", "0", "5", "3", "3", ")";
var len = keystr.length;
let key = 0;
for (let i = 0; i < len; i++) {
key += keystr.charAt(i).charCodeAt(0) * primes[i & 8].charCodeAt(0);
}
return key % 64;
}
英文:
I solved my question as with below function:
function buildKey(keystr) {
var primes = ["2", "0", "2", "0", "5", "3", "3", ")"];
var len = keystr.length;
let key = 0;
for (let i = 0; i < len; i++) {
key += keystr.charAt(i).charCodeAt(0) * primes[i & 8].charCodeAt(0);
}
return key % 64;
}
答案3
得分: -1
Node.js 自版本 10.4 开始支持 BigInt。
你可以从文档中了解更多信息:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt
或者查看这篇与 Node.js 更相关的概述:
http://thecodebarbarian.com/an-overview-of-bigint-in-node-js.html
英文:
Node.js supports BigInts since version 10.4
You can learn more from the docs:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt
Or this overview here, which is more relevant to node:
http://thecodebarbarian.com/an-overview-of-bigint-in-node-js.html
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论