SORU
19 Temmuz 2009, Pazar


Nasıl ya da başka bir aritmetik operatör kullanmadan iki sayı eklemek

Nasıl iki numaralarını kullanarak veya başka bir aritmetik operatör olmadan eklerim?

Bir soru uzun zaman önce bazı kampüs röportajda istendi. Her neyse, bugün birinin bazı bit-manipülasyon ve yanıtlar ile ilgili bir soru güzel bir rehbere sordumStanford bit twiddlingsevk edildi. Biraz zaman çalışarak geçiriyorum ve aslında bu soruya bir cevap olabileceğini düşündüm. Bir tane bile bulamadım, bilmiyorum. Bir cevap var mı?

CEVAP
19 Temmuz 2009, Pazar


Ya da, Jason'ın bit yaklaşım yerine, paralel olarak birçok bit hesaplayabilirsiniz - bu büyük sayılar ile çok daha hızlı çalışması gerekir. Her adımı taşıyan kısmı anlamaya ve toplamıdır. Tekrar taşımak sebep olan sum, carry eklemek böylece döngü çalışır.

>>> def add(a, b):
    while a != 0:
        #      v carry portion| v sum portion
        a, b = ((a & b) << 1),  (a ^ b)
        print b, a
    return b

1 eklediğinizde ve 3, Sayı 1 bit set var, 1 1 toplamı taşır. Bir sonraki adım 2'ye 2 ekleyin ve bu doğru toplam dört taşır. Bir çıkış neden olur

>>> add(1,3)
2 2
4 0
4

Ya da daha karmaşık bir örnek

>>> add(45, 291)
66 270
4 332
8 328
16 320
336

Düzenleme: Kolayca imzalı sayılar üzerinde çalışmak için a ve b üst sınırını tanıtmak gerekir

>>> def add(a, b):
    while a != 0:
        #      v carry portion| v sum portion
        a, b = ((a & b) << 1),  (a ^ b)
        a &= 0xFFFFFFFF
        b &= 0xFFFFFFFF
        print b, a
    return b

Üzerinde deneyin

add(-1, 1)

tek bir bit görmek tüm aralığı boyunca taşımak ve 32 yineleme üzerine taşması

4294967294 2
4294967292 4
4294967288 8
...
4294901760 65536
...
2147483648 2147483648
0 0
0L

Bunu Paylaş:
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Animation Workshop

    Animation Wo

    8 NİSAN 2010
  • Jonah Penna

    Jonah Penna

    11 EYLÜL 2005
  • TWiT Netcast Network

    TWiT Netcast

    27 EKİM 2005