为啥 AS3 右位移与 Java 中的相同?

Posted

技术标签:

【中文标题】为啥 AS3 右位移与 Java 中的相同?【英文标题】:Why is AS3 right bit shift different than the same thing in Java?为什么 AS3 右位移与 Java 中的相同? 【发布时间】:2018-11-29 19:59:47 【问题描述】:

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

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 中实现相同的结果?我曾尝试使用>>> 而不是>>,但它似乎不起作用。

【问题讨论】:

【参考方案1】:

我根本不知道 ActionScript,但肯定是因为数字的内部表示不同。

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

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

让我们看看 javascript 做了什么来更好地理解 ActionScript 中发生的事情:JavaScript 将所有数字存储为双浮点数,并且您肯定不会丢失可以容纳 53 位的整数的精度。 尝试使用相同的值,如果您使用 >>,您会看到与 ActionScript 中的结果相同,但如果您使用 >>>,则与 Java 中的结果相同。

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

有趣的是,python 没有>>>operator,总是进行算术移位,而且似乎在超过 64 位时也能工作。

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

【讨论】:

我明白了。好吧,无论如何,AS3 是一种已弃用的技术。非常感谢! 嗯,但 4294280300 不小于无符号 32 位整数 (4294967295) 的最大值吗? 来自操作员 >> Converts expression and shiftCount to 32-bit integers, and shifts all the bits in expression to the right by the number of places specified by the integer that results from the conversion of shiftCount. Bits that are shifted off the right end are discarded. To preserve the sign of the original expression, the bits on the left are filled in with 0 if the most significant bit (the bit farthest to the left) of expression is 0, and filled in with 1 if the most significant bit is 1. 的文档(续) ... 因此,移位运算符在执行移位之前将其左操作数转换为有符号整数。这是非常违反直觉的,但解释了为什么 AS3 代码会以这种方式工作。 @QuentinC 请随时将其纳入您的答案。 AS3 operator >> @Freshek 不。 JS 也是如此。它都被称为 EcmaScript 的同一个根

以上是关于为啥 AS3 右位移与 Java 中的相同?的主要内容,如果未能解决你的问题,请参考以下文章

Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字

Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字

Java 位移运算符

Java位移运算

imu为啥不适合跟踪位移变化?

ActionScript 3 AS3使用按位移位将RGB值转换为颜色