Wednesday, October 7, 2009

Улыбнуло

Ссылко
Вкратце. Как инвертировать знак числа, примеры из жизни.

Вариант I: 

  1. private function opposite(number:Number):Number
  2.         {
  3.                 if (number < 0)
  4.                 {
  5.                         number = Math.abs(number);
  6.                 }
  7.                 else
  8.                 {
  9.                         number = -(number);
  10.                 }
  11.                 return number;
  12.         }
Вариант II:

  1. int x = numberToInvertSign;
  2. boolean pos = x > 0;
  3. for(int i = 0; i < 2*Math.abs(x); i++){
  4.    if(pos){
  5.       numberToInvertSign--;
  6.    }
  7.    else{
  8.       numberToInvertSign++;
  9.    }
  10. }
Вариант III (особо зачотный) :

  1. switch (i)
  2. {
  3.   case 1: return -1;
  4.   case 2: return -2;
  5.   case 3: return -3;
  6.   // ... etc, you get the proper pattern
  7. }
Правильный ответ (на всякий случай): return number * -1



7 comments:

  1. какая прелесть! рыдаю ))

    ReplyDelete
  2. а return -number не работает?

    ReplyDelete
  3. Работает конечно :-)
    В некоторых случаях imho эти два варианта скомпилятся в идентичный машинный код.

    ReplyDelete
  4. разве что за счет какой-то оптимизации, как я понимаю

    ReplyDelete
  5. Ну да. На всякий случай проверил - gcc 4.2.1 выдает одинаковый ассемблер для этих выражений.

    ReplyDelete
  6. А старший бит числа инвертировать? (xor-ом) :)

    ReplyDelete
  7. В некоторых случаях это будет работать, но не во всех - смотря как представляются отрицательные числа.
    http://en.wikipedia.org/wiki/Signed_number_representations

    ReplyDelete