2013-06-01 46 views
5

這裏我想生成一個位模式來設置n數字等於1從位置p開始。 位數從0 to 31開始編號。 以下是我所做的。使用按位運算符生成特定的位模式

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

實施例:

bitPattern(6, 2) should return 
..000011111100 

具有較少運營商的任何替代解決方案?

+2

當'n + p> 31'時,您正在調用未定義的行爲。如果保證永遠不會出現這種情況,那麼您仍然有實現定義的行爲,正確地移動一個負數。但是如果你不害怕UB,那麼'((1 << n)-1)<< p'呢? –

+0

@DanielFischer在我的問題中'(n + p)'不會超越31.並且很容易識別太... – noufal

+1

無論如何,如果你只關心位,我建議使用無符號類型,然後'((1 << n)-1)<< p'是安全的,除非'n'或'p'是負數或大於或等於該類型的寬度。 –

回答

5

你可以這樣說:

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

在零的位置讓n的,計算(2^n)-1;回想2^n1<<n,所以表達式變成((1<<n)-1)。現在您需要在後面添加p零,因此將結果移至p

+0

@danielFischer給出了同樣的答案...謝謝你的解釋... – noufal