SORU
23 Ocak 2011, Pazar


İf-else veya başka herhangi bir karşılaştırma operatörü kullanmadan iki sayının maksimum bul

İki sayının maksimum bulabilirsiniz. İf-else veya başka herhangi bir karşılaştırma operatörü kullanmamalısınız. StackOverflow sormam gerektiğini düşündüm çevrimiçi ilan panosu bu soru buldum

ÖRNEK Giriş: 5, 10 10 . çıkış:

Biri bana bu kod satırları anlamanıza yardımcı olabilir bu çözümü buldum

int getMax(int a, int b) {  
    int c = a - b;  
    int k = (c >> 31) & 0x1;  
    int max = a - k * c;  
    return max;  
}

CEVAP
23 Ocak 2011, Pazar


int getMax(int a, int b) {
    int c = a - b;
    int k = (c >> 31) & 0x1;
    int max = a - k * c;
    return max;
}

Hadi bu teşrih. Bu ilk satır basittir - a b farkı saklar. Bu değer, negatif a < b eğer negatif olmayan ve aksi.

Sonraki satırda:

int k = (c >> 31) & 0x1;

fikri c değerinin negatif olup olmadığını kontrol edin. Hemen hemen tüm modern bilgisayarların içinde, bir sayı biçimi olarak adlandırılan saklanıriki tamamlayıcıhangi sayı en yüksek bit eğer sayı pozitif ise 0 ve 1 ise sayı negatif. Ayrıca, en in 32 bit. (c >> 31) 31 bit numarasını, en düşük bit için nokta sayısı en yüksek bit bırakarak geçer. Bu sayıyı alıp 1 ile Kullanılır Bir sonraki adım her yerde son bit 0 hariç olan () tüm yüksek bit siler ve sadece en düşük bit verir. c >> 31 en düşük bit olduğundan ya da 1 0 c en yüksek bit okur bu c, en yüksek bit. En yüksek bit olduğundan c 1, c olumsuz (1) ya da pozitif olup olmadığını kontrol etmenin bir yoludur (0) 1 ıff. Yukarıdaki k ile bu mantık birleştirerek a < b eğer 1 ve 0.

Son adım bunu yapmak için:

int max = a - k * c;

a < b k == 1 k * c = c = a - b, ve bu kadar

a - k * c = a - (a - b) = a - a   b = b

Doğru max, a < b beri. a >= b k == 0 Eğer yoksa, ve

a - k * c = a - 0 = a

Ayrıca doğru max.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BroadCity

    BroadCity

    10 ŞUBAT 2010
  • Dogbert files

    Dogbert file

    12 Ocak 2012
  • WestsideMrArO

    WestsideMrAr

    6 EKİM 2010