2011-11-27 22 views
5

Bunu nasıl arayacağımı bilmiyorum, bu da daha zorlayıcıdır.Belirli sayıda bitle bayt için tamsayı set

3 derken bir tamsayı var ve 11100000'a dönüştürmek istiyorum, yani, bitlerin sayısı tamsayılarının bitlerinin sayısı, en anlamlı bitden.

Ben yapılabilir sanırım:

byte result = 0; 
for(int i = 8; i > 8 - 3; i--) 
    result += 2^i; 

şey ama standart kütüphane .net dahil, hızlı/daha güzel ya, tercihen var mı? Sadece birkaç olasılık olduğundan

+0

Tamsayı 8'den büyükse ne olur? –

+6

Sadece küçük bir nokta^Özeldir veya Güç işleci değil C#. –

+0

@Martin Haha, şimdi fark etmek için bana birkaç saniye sürdü. Bazen programlamayı yaparken bir kâğıt için denklemler yazıyorsanız, kolayca unutabilirsiniz. – Max

cevap

11
int n = 3; // 0..8 
int mask = 0xFF00; 
byte result = (byte) (mask >> n); 
+0

+1, çok güzel. Oyuncu kesinlikle gerekli mi? – Cameron

+0

n> 8? –

+0

@Cameron, evet, 'mask >> n' türünün' int' –

5

, sadece onları önbelleğe olabilir:

// Each index adds another bit from the left, e.g. resultCache[3] == 11100000. 
byte[] resultCache = { 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0XF8, 0xFC, 0xFE, 0xFF }; 

Ayrıca yerine sessiz hata istisna almak istiyorum yanlışlıkla n için değer elde çalıştıkları takdirde > 8.

+0

+1 Kolayca gözden kaçan ve tüm programcıların kendi püf noktalarında sahip olması gereken bu tür problemlerin (tablo arama) birçoğuna basit ve etkili bir yaklaşıma işaret etmek için +1 teselli ödülü. (Bu durumda, Henk'in olduğu kadar iyi bir çözüm değil) –

+0

@JasonWilliams Teşekkürler. Bu alternatifi göndermeden önce Henk'in zarif çözümüne oy verdim :-). –

İlgili konular