如何将js中的var转成java?
How to convert the var in js into java?
现在尝试把一些js代码转成java,有问题:
在 js 中
46022*65535 = 3016051770
and
(46022*65535)|7867 = -1278910789
在java
46022*65535 = -1278915526 this is overflow
46022L*65535L = 3016051770L this is the same result to js
(46022*65535)|7867 = -1278910789 this one and the one below is the problem
(46022L*65535L)|7867L = 3016056507L
那么,为什么|
运算符会将两个正数变成负数?
java和js处理int和long做这个操作有什么区别?
然后,在这种情况下,如何写java兼容js的代码?
注意:我知道 int 和 long 的范围,我的问题是 |
.
更多问题:
根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
&
也是32bit操作,那么:
在 js
2996101485 & 65535 = 57709
在java
2996101485 is overflow to int so I use double to store it and cast it into int when I need to do AND.
double a = 2996101485l;
double b = 65535;
int c = (int) a & (int) b; Now c = 65535
但是如果我使用 long 进行投射:
long c = (long) a & (long) b; Now c = 57709
所以,简单地将 double 转换为 int 会导致问题。我想知道为什么?
我遇到了问题,2996101485 可以在 32 位中出现在 js 中,而在 java 中它应该很长。所以我写函数来转换这些操作,例如,&
应该使用这个 java 函数来 运行 在 js 中给出相同的结果:
private double doOR(double x, double y) {
if (x > Integer.MAX_VALUE && x <= 1l << 32) {
if (y > Integer.MAX_VALUE && y <= 1l << 32) {
return (long) x | (long) y;
} else {
return (long) x | (int) y;
}
} else {
return (int) x | (int) y;
}
}
您应该改用 long
。
System.out.println(46022L*65535L); // = 3016051770
Java 有整数和长整数。
System.out.println(Integer.MAX_VALUE); // = 2147483647
System.out.println(Long.MAX_VALUE); // = 9,223,372,036,854,775,807
至于语言的差异,我只能归结为语言之间的精度不同。 If you see this question,你会看到JS中最大的数字是9,007,199,254,740,992。这是猜测,也有可能是别的原因。
问题是 Java脚本中的数字 have roughly 53-bit precision (they appear to be based on floating point doubles), the bitwise OR operates on only 32 bits.
Bitwise operators treat their operands as a sequence of 32 bits (zeroes and ones), rather than as decimal, hexadecimal, or octal numbers.
这意味着在使用算术时,long
将为您提供 Java 类似脚本的算术(使用您的数字),因为 Java int
s 会溢出;但是当使用按位运算时,int
会给你 Java 类似脚本的结果,从那时起这两个平台都在 32 位数字上运行。
现在尝试把一些js代码转成java,有问题:
在 js 中
46022*65535 = 3016051770
and
(46022*65535)|7867 = -1278910789
在java
46022*65535 = -1278915526 this is overflow
46022L*65535L = 3016051770L this is the same result to js
(46022*65535)|7867 = -1278910789 this one and the one below is the problem
(46022L*65535L)|7867L = 3016056507L
那么,为什么|
运算符会将两个正数变成负数?
java和js处理int和long做这个操作有什么区别?
然后,在这种情况下,如何写java兼容js的代码?
注意:我知道 int 和 long 的范围,我的问题是 |
.
更多问题:
根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
&
也是32bit操作,那么:
在 js
2996101485 & 65535 = 57709
在java
2996101485 is overflow to int so I use double to store it and cast it into int when I need to do AND.
double a = 2996101485l;
double b = 65535;
int c = (int) a & (int) b; Now c = 65535
但是如果我使用 long 进行投射:
long c = (long) a & (long) b; Now c = 57709
所以,简单地将 double 转换为 int 会导致问题。我想知道为什么?
我遇到了问题,2996101485 可以在 32 位中出现在 js 中,而在 java 中它应该很长。所以我写函数来转换这些操作,例如,&
应该使用这个 java 函数来 运行 在 js 中给出相同的结果:
private double doOR(double x, double y) {
if (x > Integer.MAX_VALUE && x <= 1l << 32) {
if (y > Integer.MAX_VALUE && y <= 1l << 32) {
return (long) x | (long) y;
} else {
return (long) x | (int) y;
}
} else {
return (int) x | (int) y;
}
}
您应该改用 long
。
System.out.println(46022L*65535L); // = 3016051770
Java 有整数和长整数。
System.out.println(Integer.MAX_VALUE); // = 2147483647
System.out.println(Long.MAX_VALUE); // = 9,223,372,036,854,775,807
至于语言的差异,我只能归结为语言之间的精度不同。 If you see this question,你会看到JS中最大的数字是9,007,199,254,740,992。这是猜测,也有可能是别的原因。
问题是 Java脚本中的数字 have roughly 53-bit precision (they appear to be based on floating point doubles), the bitwise OR operates on only 32 bits.
Bitwise operators treat their operands as a sequence of 32 bits (zeroes and ones), rather than as decimal, hexadecimal, or octal numbers.
这意味着在使用算术时,long
将为您提供 Java 类似脚本的算术(使用您的数字),因为 Java int
s 会溢出;但是当使用按位运算时,int
会给你 Java 类似脚本的结果,从那时起这两个平台都在 32 位数字上运行。