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
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
Başka bir komut eklemek için Nasıl?Bas...
Düzgün < aşırı yük nasıl;< bir ba...
Nasıl bir elemanın CSS kullanmadan önc...
Nasıl Objective C her 3 basamaklı sayı...
bir liste eklemek için nasıl<T> ...