java - 为什么 AS3 右移位与 Java 中的右移位不同?

标签 java actionscript-3 flash bit-manipulation

没有一些代码很难解释..所以

var junk:uint = uint(4294280300);

trace(junk.toString(2)); // returns 11111111111101011000010001101100
junk = junk >> 8;
trace(junk.toString(2)); // returns 11111111111111111111010110000100

这是 Java 部分

long junk = 4294280300L;

System.out.println(Long.toBinaryString(junk)); // returns 11111111111101011000010001101100
junk = junk >> 8;
System.out.println(Long.toBinaryString(junk)); // returns 111111111111010110000100

我做错了什么?我怎样才能在Java中达到同样的结果?我尝试使用 >>> 而不是 >> 但它似乎不起作用。

最佳答案

我根本不懂 ActionScript,但由于数字内部表示的差异,这是肯定的。

ActionScript 的 uint 类型似乎确实是一个用 32 位编码的无符号整数。 此外,在执行右移操作之前,该数字似乎已转换为有符号整数。这种反直觉的行为解释了结果。

在 Java 中不会出现此问题,因为 long 是用 64 位编码的整数,而值 4294280300 完全适合 64 位。 如果您使用 int 而不是 long,您会观察到与 ActionScript 中相同的结果。

让我们看看 JavaScript 做了什么,以便更好地理解 ActionScript 中发生的情况:JavaScript 将所有数字存储为双 float ,并且确保不会丢失适合 53 位的整数的精度。 尝试使用相同的值,如果使用 >>,您将获得与 ActionScript 中相同的结果,但如果使用 >>>,则获得与 Java 相同的结果。

在 JavaScript 方面,似乎 >> (又名算术移位)首先将值转换为 32 位有符号整数,而 >>> (又名逻辑移位)则不会。 。 这很奇怪,而且 ActionScript 做类似的事情也就不足为奇了。

有趣的是,Python 没有 >>> 运算符,总是进行算术移位,并且似乎甚至可以在 64 位以上工作。

考虑到 this question 的受欢迎程度 或this one , >>>>> 是存在这两个运算符的语言中常见的混淆来源。

关于java - 为什么 AS3 右移位与 Java 中的右移位不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50952388/

相关文章:

java - 使用 ImageIO 输入 null 异常读取 PNG

java - Android Webview可以运行JSP吗?

Facebook.getAuthResponse() 似乎已损坏

flash - 重复事件监听器的数量?

apache-flex - 如何检测 Flash 中的内存泄漏?

javascript - 如何在 IE 中访问 Flash 对象的变量?

java - 在非泛型类中采用 List 的泛型方法

php - 这种基于浏览器的乒乓球游戏可以使用什么技术?

javascript - 如何将 jQuery 事件处理程序附加到 YouTube 电影?

data-visualization - java的时间轴创建库