2011-03-31 10 views
11

Eminim ki bunu yapmakta zorlandığımdan emin değilim.C# 2 tamsayı güçlerini hesaplamak için kolay yolu?

Math.Pow(double, double) ürününe eşdeğer bir şey kullanmak istiyor ancak bir tamsayı çıkıyor. Kayan noktalarla ilgili yuvarlama hataları konusunda endişeliyim.

uint myPower = 12; 
uint myPowerOfTwo = (uint)Math.Pow(2.0, (double)myPower); 

bu düşünce:

Ben ile gelebilir en iyisi

uint myPowerOfTwo = 1 << myPower; // doesn't work 

ama operatör "< <" türünde işlenenler ile kullanılamaz o hatayı alıyorum int veya ve uint.

Herhangi bir öneriniz var mı? Her zamanki gibi teşekkür ederim.

cevap

27

Eğer kaydırma operatörünün ikinci işlenen bir işaretli tamsayı (sağ taraf) kullanmak zorunda olacak: Eğer uint gibi başka sayısal türe sonucu yayınlayabileceğim Tabii

int myPower = 12; 
int myPowerOfTwo = 1 << myPower; 

:

MSDN itibaren
uint myPowerOfTwo = (uint) (1 << myPower); 

:

sol kaydırma operatörü (< <), numaranın ilk işleneni, ikinci işleneni tarafından belirtilen bitlerin sayısı tarafından bırakılır. İkinci işlenenin türü, bir olmalıdır. Eğer bir uzantısı/statik yöntem yaparsanız

+0

Tamam, işe yarıyor! Ama neden operatör "<<" hata iletisi int veya uint türü işlenenler ile kullanılamaz? Bir int kullanmamış mıydım? – John

+0

(OP için) Ve gerekirse son bir adım olarak uint'e dökün –

+3

@John, * ve * demediğinden emin misin? anlamı: kombinasyon? –

2

, o zaman daha sonra bulup hataları düzeltmek için daha kolay olurdu ve iyileştirici hala satır içi olacaktır:

:

public static uint Exp2(this uint exponent) { 
    return (uint)Math.Pow(2.0, (double)exponent); 
} 

Sonra gibi kullanabilirsiniz

uint myPowerOfTwo = myPower.Exp2(); 
İlgili konular