2013-06-01 23 views
5

Burada p konumundan başlayan n basamaklarını ayarlamak için bir bit deseni oluşturmak istiyorum. Basamaklar 0 to 31'dan numaralandırılmıştır. Aşağıda yaptığım şey var.Biten işleçler kullanarak belirli bir bit deseni oluşturma

int bitPattern(int n, int p) { 
    int hex, num1, num2; 
    hex = 0x80000000; 
    num1 = (hex >> (31 - p)); 
    num2 = (hex >> (31 - (n+p))); 
    return num1^num2; 
} 

Örnek: daha az operatör ile

bitPattern(6, 2) should return 
..000011111100 

herhangi bir alternatif çözüm?

+2

Tanımsız davranışı, n + p> 31 olduğunda çağırıyorsunuz. Durumun asla garanti edilmemesi durumunda, yine de negatif bir sayıyı doğru kaydırarak uygulama tanımlı davranışınız vardır. Ama eğer UB'den korkmuyorsan, ne hakkında ((1 << n) - 1) << p'? –

+0

@DanielFischer benim sorunumda (n + p) '31'in ötesine geçmeyecek ve bunu tanımlamak çok kolay ... – noufal

+1

Neyse, yalnızca bitleri önemsiyorsanız, imzasız bir yazı kullanmanızı öneririm, ve sonra '((1 << n) - 1) << p',' n' veya 'p' negatif değilse veya türün genişliğine eşit veya daha büyük değilse güvenlidir. –

cevap

5

Böyle yapabilirsiniz:

return ((1<<n)-1)<<p; 

(2^n)-1 hesaplamak, pozisyon sıfır n olanları yapmak için; 2^n'un 1<<n olduğunu hatırlatırsanız, ifade ((1<<n)-1) olur. Şimdi arkada p sıfırları eklemeniz gerekiyor, bu yüzden sonucu p ile değiştirin.

+0

@danielFischer aynı cevabı verdi ... Açıklama için teşekkürler ... – noufal

İlgili konular