【发布时间】:2011-12-22 06:02:07
【问题描述】:
或者...如何在不得到整数结果的情况下进行 XOR 加倍?
我正在使用 Actionscript 3.0 并发现以下内容:
var a:Number = 3.000000004;
var b:Number = 29.999999999;
trace ("a: " + a); //3.000000004
trace ("b: " + b); //29.999999999
a ^= b;
b ^= a;
a ^= b;
trace ("a: " + a); //29
trace ("b: " + b); //3
显然,XOR 操作将我的数字转换为整数。我对此有点惊讶,并不完全理解其背后的原因。但我确实知道其他按位运算也会将 Number 更改为 int,所以我并不感到惊讶。。
尽管如此,有没有办法在不将它们截断为整数的情况下对双精度数(又名数字)进行异或运算?我最初使用上面的 XOR 来优化性能(这些数字开关在数组中执行了数百万次)。我假设如果我跳过临时变量,我会看到速度增加。唉,如果把 Number 数据改成 int,那就白费了。
只是想知道是否有解决方案,或者在这种情况下我是否需要放弃 XOR。
(ps,我暂时无法查看这个帖子,但在此期间感谢任何建议、知识等)
(pps,如果你好奇,这是我尽可能加快速度的方法)
public static function reversePairs(values:Vector.<Number>):void {
//1, 2, 3, 4, 5, 6 -> 5, 6, 3, 4, 1, 2
var l:int = values.length;
var n:int = l * 0.5;
n -= n % 2;
for (var a:int = 0; a < n; a++) {
var b:int = (l - a) - 2 * ((a + 1) % 2);
//we cannot use xor because it truncates the decimal value
//values[a] ^= values[b];
//values[b] ^= values[a];
//values[a] ^= values[b];
//we MUST use a temporary variable instead
var c:Number = values[b];
values[b] = values[a];
values[a] = c;
}
}
【问题讨论】:
-
你为什么要异或双打??
-
我需要切换它们的值。 XOR 适用于引用(因为您正在交换内存地址)。但是对于原语来说,行为显然是不同的。希望所提供的附加代码能够使我的目的显而易见。
标签: actionscript-3 optimization bit-manipulation