2012-11-25 20 views
12

Sadece bitshift veya bitwise operatörleri kullanarak bir tam sayıyı başka bir tamsayıya (her ikisi de pozitif) bölerek kalanın nasıl elde edileceğini bilmek istiyorum. / operatörü veya % operatörü kullanılmamalıdır. Örneğin, bölme birimi 2^k biçimindeyken kalanını elde etmek için, aşağıdaki işlem kalanını verir. d şeklinde 2^k olduğu zamanKalanları elde etmek için Bitshifts

m = n & (d - 1)

d = The divisor

n = The number

m = Remainder

Bununla birlikte, bu yöntem sadece çalışır. Ben 2 olmayan güçler için benzer bir yöntem bilmek istiyorum. Şu anda programming challenges bir sorun üzerinde çalışıyorum ve program yürütme süresini azaltmak için böyle bir yöntem kullanmak istiyorum

+1

Bit gösteriminin sadece baz 2'de olması bir sınırlama olmaz mıydı? Değeri 43/7 düşünün - değer aslında 6.142857 .... Bir temelde 2'den daha yüksek bir değer için hangi genel yaklaşımı düşündünüz? – Makoto

+5

Genel bir yöntem yoktur. Bölünmeyi biliyorsanız, bölmeyi bir çarpma ve bazı geçişler ve eklemeler/çıkarmalar ile değiştirebilirsiniz. Yetkili C derleyicisine bu konuda sorun ve herhangi bir derleme zamanı sabiti için size sihirli değerler verecektir. –

+0

Cevap sadece 1 bitshift deyimi içermiyorsa, javas mod operatörünü dövmediğinize bahse girerim. – goat

cevap

1

Operatör % kullanmayan herhangi bir yanıt daha az verimli bir yanıt olacaktır, ancak, kesinlikle kullanamazsanız operatör, o zaman, bir çözüm n art arda gelen d çıkarmak için bir döngü kullanmaktır:

m = n; 
while (m >= d) 
{ 
    m -= d; 
} 

sizin tamsayılar 32 bit olduğunu varsayarsak, o zaman biz n den d katları silmek optimize edilmiş bir versiyonunu düşünebiliriz:

Bu örnek, tamsayıların imzalandığını ve taşma için izlediğini varsayar, yani di > 0 için sınama.

+1

maalesef, normal bir 2s-kompleman makinesini alsanız bile taşma kayması mutlaka negatif bir sayıya neden olmaz. –

İlgili konular