2013-04-17 106 views
4

鑑於像10的整數設置位,我怎麼會在總共16位像這樣寫10個1比特(從左側開始):位運算在C:從左

11111111.11000000 

或給予一個整數像4,它會寫:

11110000.00000000 

謝謝,我仍然學習C,並不熟悉按位運算。

回答

3

-(1 << wordsize - numbits)應該這樣做。

查看您的示例中會發生什麼很有意義。 1 << wordsize - numbits1 << 12,這是00010000.00000000。回顧-x = ~x+1,我們計算~(1 << 12) = 11101111.111111。加1,你得到11110000.00000000

+0

+1很棒的答案 - 真正高效的代碼。 –

1

實際上,它通常是32位。但我只在評論中加了16位,以便更清楚。

int i = 0; //00000000 00000000 
int mask = 65536; //10000000 00000000 
int retVal = 0; //00000000 00000000 
int yourAmountOfBitsToOne = 2; 

for(i = 0; i < yourAmountOfBitsToOne; i++){ 
    retVal = retVal | (mask >> i); 
} 

printf("%d", retVal); 

如果你運行這個輸出應爲216 + 215 = 98304.

爲什麼?

迭代0:

line 1: retVal = 00000000 00000000 | (10000000 00000000 >> 0) 
line 1: retVal = 10000000 00000000 

迭代1:

line 1: retVal = 10000000 00000000 | (10000000 00000000 >> 0) 
line 1: retVal = 10000000 00000000 | (01000000 00000000) 
line 1: retVal = 11000000 00000000 

後爲完成,則打印的11000000 00000000整數值是98304

現在創建一個函數,它可以逐位打印int retVal,它可以讓您輕鬆檢查輸出是否正確。學習按位運算符也是一個很好的練習。

希望它有幫助。

0

整數通常是32位。如果你指的是短整數,則:

unsigned short MakeMask16(unsigned short width,unsigned short offsetFromLeft) 
{ 
    unsigned short mask = -1; 
    mask <<= (sizeof(unsigned short)*8-width); 
    mask >>= offsetFromLeft; 
    return mask; 
} 

或全部一行:

unsigned short MakeMask16(unsigned short width,unsigned short offsetFromLeft) 
{ 
    return (unsigned short(-1<<(sizeof(unsigned short)*8-width)) >> offsetFromLeft); 
} 

需要注意的是,如果你不向右移位之前將其轉換爲一個無符號總之, 1你認爲你從左邊推下去還會在那裏。如果你不需要從左邊偏移,那麼你可以忽略它並剝去右移。