Или ... как вы удваиваете 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 (или числа) без их усечения до целых чисел? Первоначально я использовал 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;
}
}