İlk olarak, bir açıklama:
s = 4
Aşağıdaki Açma elemanı almak (yani, modülü 0xF
eşittir):
m = (n & 0x0F0F0F0F) + ((n >> 4) & 0x0F0F0F0F)
m = ((n >> 16) + (n & 0x0000FFFF)
m = ((n >> 8) + (n & 0x000000FF)
m = ((n >> 4) + (n & 0x0000000F)
m = ((n >> 4) + (n & 0x0000000F)
m = ((n >> 4) + (n & 0x0000000F)
m = ((n >> 4) + (n & 0x0000000F)
m = m == 0xF ? 0 : m;
Bu, sorunuzda sahip olduğunuzdan çok farklı. Bunun nedenini açıklamak için:
Matematik numaralarını hiç duydunuz; burada bir sayının tüm rakamlarını eklerseniz ve 9'a bölünebilirse, o zaman orijinal numara da olur? Bu çalışır çünkü hem orijinali hem de toplamı 9'a bölen kalanlar aynıdır. Aslında, burada yaptığımız şey, sadece farklı bir üste - örneğinizde, onaltılık taban ile.
matematik kung-fu şudur:
nihai değere Her onaltılık rakamın katkısı V * 16^P
olarak temsil edilebilir. Not: 16^P = 1 (mod 15)
, bu nedenle her onaltılık hane değerinin nihai değere olan katkısı sadece V (mod 15)
'dur. Diğer bir deyişle, tüm basamaklardan toplam katkı almak için hepsini (mod 15)
'a ekleyin.
Bitsel işlemler, bunu logaritmik adım adımlarında gerçekleştirmenin akıllıca bir yoludur: onaltılı basamakların ilk yarısını ikinci yarısına art arda ekleyin.
9'ın hilesiyle ilgili problem, iki basamaklı bir sayı ile sonuçlanabilir: 99 = 9 + 9 = 18 (mod 10)! Sonra tekrar sadece hile yapmak: 18 = 1 + 8 = 9 (mod 10).
Benzer şekilde, kalan sayı bir basamak olana kadar m = ((n >> 4) + (n & 0x0000000F)
'un 'ekstra' yinelemelerini takip ediyoruz.
Artık geriye kalan tek ayrıntı, 0xF
sonucunu alırsak bunun yerine 0x0
olmasını istiyoruz.
Evet, bunu biliyordum. Şu anda şubeler ve 2^n-1 formunda bir maske kullanan bir montaj modülü yöntemini optimize etmeye çalışıyorum. Bu yüzden dallardan kurtulmaya çalışıyorum ve bunun yerine bu yöntemi kullanıyorum. –
İlginç. 2^n-1 modülünü kullanan ne tür bir uygulama olduğunu sorabilir miyim? Bunun yerine 2^n veya asal sayı kullanmamanın bir nedeni var mı? – JS1
@ JS1 Bu olağandışı değil. Birçok örneği: Genel olarak bir bayt-bilge Reed-Solomon kodu (veri hatası tanıma ve düzeltme) ve Galois alan tabanlı algoritmalar. Kodlama (RS) peri basit kod-bilge, esas olarak döngüler, eklemeler ve modulo oluşur (kod çözme sırasında her zaman yerine önceden bazı statik veriler hesaplanır) – deviantfan