Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   старый добрый swap() — возможен вообще? (http://www.flasher.ru/forum/showthread.php?t=150730)

Zebestov 17.02.2011 00:27

старый добрый swap() — возможен вообще?
 
У меня код как рулон обоев только из-за того, что я не вижу никакой возможности вынести конструкцию типа
Код AS3:

swap = a;
a = b;
b = swap;

в отдельную функцию, которая меняла бы значения двух переменных типа Number.
Такое вообще возможно на AS3? Скорость работы критична — таких операций десятки тысяч на кадр.

semenyakinVS 17.02.2011 01:12

А чего нельзя обернуть операцию в функцию статического класса?

Zebestov 17.02.2011 01:29

Немножечко поумничаю: вроде как нет такого понятия "статический класс" в AS3, и функции класса принято называть методами.
Но не суть — а что это даст? Метод не работает с числовым аргументом как со ссылкой. Он его... как бы это сказать... локализует автоматом. Поэтому если ты передашь какой-то a:Number = 10.5 в какой-то метод, внутри которого происходит коварное a = 5.5, это не возымеет никакого эффекта снаружи. Там a по прежнему будет равняться 10.5
Если бы все было так просто ;)

i.o. 17.02.2011 01:50

вариант - хранить 2 числа как объект или массив, тогда при передаче в функцию свап становится возможным )

Zebestov 17.02.2011 01:57

Скорость доступа к динамическому полю объекта или к элементу массива расценивается как неудовлетворительная.

i.o. 17.02.2011 02:11

дык задай жестко, классом с паблик переменными - так очень даже удовлетворительно )
хотя конечно сама идея вызывать функцию, чтобы она меняла... Сам по-себе вызов функции дорогой.. Это если конечно настолько критично по скоростям.

Zebestov 17.02.2011 03:01

Менять надо походу четыре пары по одному условию. И если задуматься об организации swap-а для 12 переменных, с явным указанием на конкретную пару... как-то лучше как у меня сейчас:

Код AS3:

// сортируем вершины
if (sy0 > sy1) {
        swap = sy0;
        sy0 = sy1;
        sy1 = swap;
 
        swap = sx0;
        sx0 = sx1;
        sx1 = swap;
 
        swap = u0;
        u0 = u1;
        u1 = swap;
 
        swap = v0;
        v0 = v1;
        v1 = swap;
}
if (sy1 > sy2) {
        swap = sy1;
        sy1 = sy2;
        sy2 = swap;
 
        swap = sx1;
        sx1 = sx2;
        sx2 = swap;
 
        swap = u1;
        u1 = u2;
        u2 = swap;
 
        swap = v1;
        v1 = v2;
        v2 = swap;
}
if (sy0 > sy1) {
        swap = sy0;
        sy0 = sy1;
        sy1 = swap;
 
        swap = sx0;
        sx0 = sx1;
        sx1 = swap;
 
        swap = u0;
        u0 = u1;
        u1 = swap;
 
        swap = v0;
        v0 = v1;
        v1 = swap;
}

По крайней мере свернул и забыл ;) а быстрее точно не будет.

i.o. 17.02.2011 03:28

в байткоде кстати есть операция swap.. но это так, к слову :)

Bgg 17.02.2011 03:53

В функцию фиг знает как обернуть, но вобще можно обойтись и без 3 переменной.
Код AS3:

var a:Number = 123456;
var b:Number = 355321;
 
trace(a,b);
 
a = a + b;
b = a - b;
a = a - b;
 
trace(a,b);


Zebestov 17.02.2011 04:48

@i.o. тогда это свинство! ))
@Bgg хочешь сказать, что это быстрее? или так, к общей пьянке? )

the_nitro 17.02.2011 12:28

Можно так:
a ^= b;
b ^= a;
a ^= b;

zuxul 17.02.2011 13:34

Это сработает, если Вам не нужны хвосты после точки в числе...

semenyakinVS 17.02.2011 13:54

А в AS3, часом, нет чего-нибудь вроде сишных макросов? Которые генерируют код в момент компиляции?

Если есть - может помочь.

Добавлено через 46 секунд
Цитата:

a ^= b;
b ^= a;
a ^= b;
Ух ты! Что это?

bav 17.02.2011 14:01

operators#bitwise_XOR_assignment

Zebestov 17.02.2011 14:12

the_nitro, и как мне пользоваться этой операцией для swap-а координат U и V (это числа от 0 до 1), если результат возвращается в int?

Котяра 17.02.2011 14:50

Что-то подобное наверное сможет realaxy editor.
Также можно написать сниппет/плагин для FD.
Но итоговый код всё равно будет с swap.

Волгоградец 17.02.2011 15:48

Я тоже однажды озадачился таким вопросом. Универсальный метод написал такой (как в примере Bgg):
Код AS3:

var a:Number = 10.5;
var b:Number = 15.3;
swap(a, b, 'a', 'b');
function swap(a:Number, b:Number, strA:String, strB:String):void
{
        a = a + b;
        b = a - b;
        a = a - b;
 
        this[strA] = a;
        this[strB] = b;
}

Но он очень медленный. В итоге я завел для каждой пары переменных свой метод (у меня их было не много):
Код AS3:

var a:Number = 10.5;
var b:Number = 15.3;
swapAB(a, b);
function swapAB(i:Number, j:Number):void
{
        i = i + j;
        j = i - j;
        i = i - j;
 
        a = i;
        b = j;
}

Этот работает как молния - в релизном плеере разницы между bitwise и этим - нету.

i.o. 17.02.2011 15:56

да уж проще тогда:
Код AS3:

public final class NumberPair
{
        public function NumberPair( a:Number=0.0, b:Number=0.0 )
        {
                this.a = a;
                this.b = b;
        }
 
 
        public var a:Number;
        public var b:Number;
 
        private var _swap:Number;
 
 
        public function swap():void
        {
                _swap = a;
                a = b;
                b = _swap;
        }
}

И кстати, Волгоградец:
Код AS3:

function swapAB(i:Number, j:Number):void
{
        /* Лишнее!
        i = i + j;
        j = i - j;
        i = i - j;
        */

        a = j;
        b = i;
}


Zebestov 17.02.2011 15:59

эээ...
Код AS3:

var a:Number = 10.5;
var b:Number = 15.3;
swapAB(a, b);
function swapAB(i:Number, j:Number):void
{
        //i = i + j;
        //j = i - j;
        //i = i - j;
 
        a = j
        b = i;
}

не?

Добавлено через 3 минуты
Опередил.
Ну а если вернуться к коду из поста номер 7, то станет видно, что методы для swap-а двух конкретных значений не подойдут. Придется только для данного случая наплодить 8 новых функций.

Волгоградец 17.02.2011 16:09

Да, это я лоханулся - конечно лишнее ).
Zebestov, а что, неужели в Haxe нет аналога ref?

Vektor 17.02.2011 19:44

Цитата:

Сообщение от Zebestov (Сообщение 973926)
Менять надо походу четыре пары по одному условию. И если задуматься об организации swap-а для 12 переменных, с явным указанием на конкретную пару... как-то лучше как у меня сейчас:

Код AS3:

// сортируем вершины
if (sy0 > sy1) {
        swap = sy0;
        sy0 = sy1;
        sy1 = swap;
 
        swap = sx0;
        sx0 = sx1;
        sx1 = swap;
 
        swap = u0;
        u0 = u1;
        u1 = swap;
 
        swap = v0;
        v0 = v1;
        v1 = swap;
}
if (sy1 > sy2) {
        swap = sy1;
        sy1 = sy2;
        sy2 = swap;
 
        swap = sx1;
        sx1 = sx2;
        sx2 = swap;
 
        swap = u1;
        u1 = u2;
        u2 = swap;
 
        swap = v1;
        v1 = v2;
        v2 = swap;
}
if (sy0 > sy1) {
        swap = sy0;
        sy0 = sy1;
        sy1 = swap;
 
        swap = sx0;
        sx0 = sx1;
        sx1 = swap;
 
        swap = u0;
        u0 = u1;
        u1 = swap;
 
        swap = v0;
        v0 = v1;
        v1 = swap;
}

По крайней мере свернул и забыл ;) а быстрее точно не будет.

А если попробовать так.
При условии, что значения нужно отдать после сортировки.

Код AS3:

// меняем значения вершин
var swapSy0Sy1:Boolean=false;
var swapSy1Sy2:Boolean=false;
 
if (sy0 > sy1) {
        swapSy0Sy1=true;
}
if (sy1 > sy2) {
        swapSy1Sy2=true;
}
if(swapSy0Sy1){
cord0=sy1
cord1=sy0
}
if(swapSy1Sy2){
cord1=sy2
cord2=sy1
}


Zebestov 17.02.2011 19:47

Предложенный алгоритм не эквивалентен моему. Посмотри внимательней, что он делает и как )

Vektor 17.02.2011 20:07

Правильно, ваш алгоритм меняет значения в переменых, А на Б и Б на А.
Мой алгоритм меняет А и Б местом(А становится Б, а Б становится А), что аналогично, при условии что значения нужно отдать.
при этом не каких операций с сортировкой не ведется.

BlooDHounD 17.02.2011 20:07

а запись в одну строчку не прокатит? я обычно так и пишу

Zebestov 17.02.2011 20:18

Vektor, алгоритмы разные по результату, а не по стилю его выдачи. Подсказка: повтор первого сравнения с последующей перестановкой в конце алгоритма — это не опечатка.

BlooDHounD, да как-то хрен редьки не слаще ) все равно этот рулончик живет в свернутом виде.

i.o. 17.02.2011 20:55

Еще как вариант могу предложить класс NumberRef, который хранит значение числа.

NumberRef.as
Код AS3:

package  
{
        public class NumberRef
        {
 
                public static function swap( a:NumberRef, b:NumberRef ):void
                {
                        var swapTemp:Number = a.value;
                        a.value = b.value;
                        b.value = swapTemp;
                }
 
 
                public function NumberRef( value:Number=NaN )
                {
                        this.value = value;
                }
 
 
                public var value:Number;
 
        }
}

Отстает от ручной перемены значений ненамного:

Array/*Number*/:
Цитата:

PlayerVersion: WIN 10,1,102,64
PlayerType: StandAlone
PlayerIsDebugger: false
---------------------
_generateRandomNums( 12000000 ) -> time: 8177 ms
_testCost$Brute() -> time: 228 ms
_testCost$Ref() -> time: 260 ms
_testSwaping$Brute() -> time: 276 ms
_testSwaping$Ref() -> time: 369 ms
Vector.<Number>:
Цитата:

PlayerVersion: WIN 10,1,102,64
PlayerType: StandAlone
PlayerIsDebugger: false
---------------------
_generateRandomNums( 12000000 ) -> time: 702 ms
_testCost$Brute() -> time: 821 ms
_testCost$Ref() -> time: 890 ms
_testSwaping$Brute() -> time: 876 ms
_testSwaping$Ref() -> time: 965 ms
_testCost*() - оценка времени работы функции без свапинга
_testSwaping*() - оценка времени работы функции со свапингом
При вычитании одного из другого, можем оценить насколько отличается время самого свапинга.

Заодно выяснилось (в принципе оно давно было известно), что Vector.<> по времени доступа - тормоз. Но зато скорость записи случайных чисел достойна всех похвал ;)
Код класса с тестами:

Main.as
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.system.Capabilities;
        import flash.system.System;
        import flash.text.TextField;
        import flash.utils.getTimer;
        import flash.utils.setTimeout;
 
        [SWF(width='620', height='420', frameRate='30', scriptTimeLimit='60', scriptRecursionLimit='1000')]
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        _txtOutput = new TextField();
                        _txtOutput.x = 10;
                        _txtOutput.y = 10;
                        _txtOutput.width = 600;
                        _txtOutput.height = 400;
                        _txtOutput.text = "";
                        _txtOutput.border = true;
                        this.addChild( _txtOutput );
 
                        _addLog( "PlayerVersion: " + Capabilities.version );
                        _addLog( "PlayerType: " + Capabilities.playerType );
                        _addLog( "PlayerIsDebugger: " + Capabilities.isDebugger );
                        _addLog( "---------------------" );
 
                        setTimeout( _startTest, 1000 );
                }
 
 
 
                private var _txtOutput:TextField;
 
                private var _randomNums:Array/*Number*/;
        //        private var _randomNums:Vector.<Number>;
 
 
 
                private function _startTest():void
                {
                        var tm:uint;
                        var total:uint = 12 * 1000 * 1000;
 
                        tm = getTimer();
                        _generateRandomNums( total );
                        _addLog( "_generateRandomNums( " + total + " ) -> time: " + (getTimer() - tm) + " ms" );
 
                        tm = getTimer();
                        _testCost$Brute();
                        _addLog( "_testCost$Brute() -> time: " + (getTimer() - tm) + " ms" );
 
                        tm = getTimer();
                        _testCost$Ref();
                        _addLog( "_testCost$Ref() -> time: " + (getTimer() - tm) + " ms" );
 
                        tm = getTimer();
                        _testSwaping$Brute();
                        _addLog( "_testSwaping$Brute() -> time: " + (getTimer() - tm) + " ms" );
 
                        tm = getTimer();
                        _testSwaping$Ref();
                        _addLog( "_testSwaping$Ref() -> time: " + (getTimer() - tm) + " ms" );
                }
 
                private function _addLog( message:String ):void
                {
                        _txtOutput.appendText( message + "\n" );
                }
 
                private function _generateRandomNums( total:uint=1000 ):void
                {
                        _randomNums = [];
                //        _randomNums = new Vector.<Number>( total, true );
 
                        while( total-- )
                        {
                                _randomNums[total] = Math.random();
                        }
                }
 
                private function _testCost$Brute():void
                {
                        var sx0:Number;
                        var sx1:Number;
                        var sx2:Number;
 
                        var sy0:Number;
                        var sy1:Number;
                        var sy2:Number;
 
                        var u0:Number;
                        var u1:Number;
                        var u2:Number;
 
                        var v0:Number;
                        var v1:Number;
                        var v2:Number;
 
                        var swap:Number;
 
 
                        var i:int = -1;
                        var l:int = int(_randomNums.length / 12);
                        while( ++i < l )
                        {
                                sx0 = _randomNums[i + 0];
                                sx1 = _randomNums[i + 1];
                                sx2 = _randomNums[i + 2];
 
                                sy0 = _randomNums[i + 3];
                                sy1 = _randomNums[i + 4];
                                sy2 = _randomNums[i + 5];
 
                                u0 = _randomNums[i + 6];
                                u1 = _randomNums[i + 7];
                                u2 = _randomNums[i + 8];
 
                                v0 = _randomNums[i + 9];
                                v1 = _randomNums[i + 10];
                                v2 = _randomNums[i + 11];
                        }
                }
                private function _testSwaping$Brute():void
                {
                        var sx0:Number;
                        var sx1:Number;
                        var sx2:Number;
 
                        var sy0:Number;
                        var sy1:Number;
                        var sy2:Number;
 
                        var u0:Number;
                        var u1:Number;
                        var u2:Number;
 
                        var v0:Number;
                        var v1:Number;
                        var v2:Number;
 
                        var swap:Number;
 
 
                        var i:int = -1;
                        var l:int = int(_randomNums.length / 12);
                        while( ++i < l )
                        {
                                sx0 = _randomNums[i + 0];
                                sx1 = _randomNums[i + 1];
                                sx2 = _randomNums[i + 2];
 
                                sy0 = _randomNums[i + 3];
                                sy1 = _randomNums[i + 4];
                                sy2 = _randomNums[i + 5];
 
                                u0 = _randomNums[i + 6];
                                u1 = _randomNums[i + 7];
                                u2 = _randomNums[i + 8];
 
                                v0 = _randomNums[i + 9];
                                v1 = _randomNums[i + 10];
                                v2 = _randomNums[i + 11];
 
 
                                // сортируем вершины
                                if (sy0 > sy1)
                                {
                                        swap = sy0;
                                        sy0 = sy1;
                                        sy1 = swap;
 
                                        swap = sx0;
                                        sx0 = sx1;
                                        sx1 = swap;
 
                                        swap = u0;
                                        u0 = u1;
                                        u1 = swap;
 
                                        swap = v0;
                                        v0 = v1;
                                        v1 = swap;
                                }
                                if (sy1 > sy2)
                                {
                                        swap = sy1;
                                        sy1 = sy2;
                                        sy2 = swap;
 
                                        swap = sx1;
                                        sx1 = sx2;
                                        sx2 = swap;
 
                                        swap = u1;
                                        u1 = u2;
                                        u2 = swap;
 
                                        swap = v1;
                                        v1 = v2;
                                        v2 = swap;
                                }
                                if (sy0 > sy1)
                                {
                                        swap = sy0;
                                        sy0 = sy1;
                                        sy1 = swap;
 
                                        swap = sx0;
                                        sx0 = sx1;
                                        sx1 = swap;
 
                                        swap = u0;
                                        u0 = u1;
                                        u1 = swap;
 
                                        swap = v0;
                                        v0 = v1;
                                        v1 = swap;
                                }
                        }
                }
 
                private function _testCost$Ref():void
                {
                        var sx0:NumberRef = new NumberRef();
                        var sx1:NumberRef = new NumberRef();
                        var sx2:NumberRef = new NumberRef();
 
                        var sy0:NumberRef = new NumberRef();
                        var sy1:NumberRef = new NumberRef();
                        var sy2:NumberRef = new NumberRef();
 
                        var u0:NumberRef = new NumberRef();
                        var u1:NumberRef = new NumberRef();
                        var u2:NumberRef = new NumberRef();
 
                        var v0:NumberRef = new NumberRef();
                        var v1:NumberRef = new NumberRef();
                        var v2:NumberRef = new NumberRef();
 
                        var i:int = -1;
                        var l:int = int(_randomNums.length / 12);
                        while( ++i < l )
                        {
                                sx0.value = _randomNums[i + 0];
                                sx1.value = _randomNums[i + 1];
                                sx2.value = _randomNums[i + 2];
 
                                sy0.value = _randomNums[i + 3];
                                sy1.value = _randomNums[i + 4];
                                sy2.value = _randomNums[i + 5];
 
                                u0.value = _randomNums[i + 6];
                                u1.value = _randomNums[i + 7];
                                u2.value = _randomNums[i + 8];
 
                                v0.value = _randomNums[i + 9];
                                v1.value = _randomNums[i + 10];
                                v2.value = _randomNums[i + 11];
                        }
                }
                private function _testSwaping$Ref():void
                {
                        var sx0:NumberRef = new NumberRef();
                        var sx1:NumberRef = new NumberRef();
                        var sx2:NumberRef = new NumberRef();
 
                        var sy0:NumberRef = new NumberRef();
                        var sy1:NumberRef = new NumberRef();
                        var sy2:NumberRef = new NumberRef();
 
                        var u0:NumberRef = new NumberRef();
                        var u1:NumberRef = new NumberRef();
                        var u2:NumberRef = new NumberRef();
 
                        var v0:NumberRef = new NumberRef();
                        var v1:NumberRef = new NumberRef();
                        var v2:NumberRef = new NumberRef();
 
                        var i:int = -1;
                        var l:int = int(_randomNums.length / 12);
                        while( ++i < l )
                        {
                                sx0.value = _randomNums[i + 0];
                                sx1.value = _randomNums[i + 1];
                                sx2.value = _randomNums[i + 2];
 
                                sy0.value = _randomNums[i + 3];
                                sy1.value = _randomNums[i + 4];
                                sy2.value = _randomNums[i + 5];
 
                                u0.value = _randomNums[i + 6];
                                u1.value = _randomNums[i + 7];
                                u2.value = _randomNums[i + 8];
 
                                v0.value = _randomNums[i + 9];
                                v1.value = _randomNums[i + 10];
                                v2.value = _randomNums[i + 11];
 
 
                                // сортируем вершины
                                if( sy0.value > sy1.value )
                                {
                                        NumberRef.swap( sy0, sy1 );
                                        NumberRef.swap( sx0, sx1 );
                                        NumberRef.swap( u0, u1 );
                                        NumberRef.swap( v0, v1 );
                                }
                                if( sy1.value > sy2.value )
                                {
                                        NumberRef.swap( sy1, sy2 );
                                        NumberRef.swap( sx1, sx2 );
                                        NumberRef.swap( u1, u2 );
                                        NumberRef.swap( v1, v2 );
                                }
                                if( sy0.value > sy1.value )
                                {
                                        NumberRef.swap( sy0, sy1 );
                                        NumberRef.swap( sx0, sx1 );
                                        NumberRef.swap( u0, u1 );
                                        NumberRef.swap( v0, v1 );
                                }
                        }
                }
        }
 
}


Rzer 17.02.2011 21:08

Код AS3:

var a:int = 10;
var b:int = 20;
 
a = swap(b, b = a);
 
trace(a, b);
 
 
public function swap (val1:Number, val2:Number):int {
        return val1;
}


i.o. 17.02.2011 21:30

Код AS3:

var a:int = 10;
var b:int = 20;
 
a = b + 0*(b = a);
 
trace(a, b);

:D

Vektor 17.02.2011 21:44

Вот тут выкладываю, логику моего алгоритма.
Код AS3:

// меняем значения вершин
var swapSy0Sy1:Boolean=false;
var swapSy0Sy2:Boolean=false;
var swapSy1Sy2:Boolean=false;
 
 
if (sy0 > sy1) {
        swapSy0Sy1=true;
}else {
//Нечего не меняем.
}
if(swapSy0Sy1){
  if (sy0 > sy2) {
swapSy0Sy2=true;
  } else {
//Выдаем значения.
    sy0(= sy1)
    sy1(= sy0)
    sx0(= sx1)
    sx1(= sx0)
    u0(=u1)
    u1(=u0)
    v0(=v1)
    v1(=v0)
 
}
}
if(swapSy0Sy2){
  if (sy1 > sy2) {
swapSy1Sy2=true;
  } else {
//Выдаем значения.
        sy0(=sy2)
        sy2(=sy0)
        sx0(=sx2)
        sx2(=sx0)
        u0(=u2)
        u2(=u0)
        v0(=v2)
        v2(=v0)
 
}
}
if(swapSy1Sy2){
//Выдаем значения.
        sy1(=sy2)
        sy2(=sy1)
        sx1(=sx2)
        sx2(=sx1)
        u1(=u2)
        u2(=u1)
        v1(=v2)
        v2(=v1)
 
}

Если, что-то неверно в логике пишите.

P/S Конечно, тут кое что нужно дописать, но алгоритм рассчитан, сортировать не сортируя, человек должен скомпилить логику и выдать нагора результат, при условии что нужна скорость. Компьютер может делать умножения, но зачем это делать, если нужен только результат...

Rzer 17.02.2011 21:47

Тогда уж: a = a + b - (b = a); Чтобы без умножения)) это нужно на олимпиадах по информатике давать =)

expl 17.02.2011 21:52

Цитата:

Zebestov, а что, неужели в Haxe нет аналога ref?
Аналога нет, но может макросами сделать swap получится?

Zebestov 17.02.2011 21:53

О! Пошла жара ) извраты конечно )) но можно попробовать. Хотя кроме компактности эти хитрости больше ничего не дают. Заменить одно присваивание на сложение и вычитание боюсь никак не оптимизация ) но прикольно!

Добавлено через 5 минут
В HaXe я еще начинающий, так что не в курсе что там и как. Прошелся по докам — указателей не обнаружил.

Rzer 17.02.2011 22:01

Zebestov, что ты возмущаешься?
Код AS3:

var a:int = 10;
                        var b:int = 20;
                        var m:uint;
                        var i:int;
 
                        m = getTimer();
 
                        for (i = 0; i < 1000000; i++) {
                                a = a + b - (b = a);
                        }
 
                        trace(getTimer() - m);
 
                        //////////
 
                        var s:int;
 
                        m = getTimer();
 
                        for (i = 0; i < 1000000; i++) {
                                s = a;
                                a = b;
                                b = s;
                        }
 
                        trace(getTimer() - m);

Output
114
184

=)

Zebestov 17.02.2011 22:07

Отлично! Мой случай правда Number, но там тоже в среднем ваш алгоритм быстрее на 35-40%

Rzer 17.02.2011 22:19

Ладно, обманул я тебя =) Не быстрее, только в дебаг версии так получается, где номер строки отслеживается. Запишешь в одну строчку s = a; a = b; b = s; и уже медленнее

Zebestov 17.02.2011 22:22

Хха! Век живи ) я не знал об этом нюансе.

Котяра 18.02.2011 00:18

в дебаг версии вообще не стоит сравнивать быстродействие.

nuToH 18.04.2011 02:46

вот еще вариант для int:
Код AS1/AS2:

var a:int = -15;
var b:int = 99;
b = b ^ a ^ (a = b);
trace('a: ' + a); //a: 99
trace('b: ' + b); //b: -15

...
по идее b = a ^ 0 & (a = b); будет быстрее


Часовой пояс GMT +4, время: 15:49.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.