鑑於像10的整數設置位,我怎麼會在總共16位像這樣寫10個1比特(從左側開始):位運算在C:從左
11111111.11000000
或給予一個整數像4,它會寫:
11110000.00000000
謝謝,我仍然學習C,並不熟悉按位運算。
鑑於像10的整數設置位,我怎麼會在總共16位像這樣寫10個1比特(從左側開始):位運算在C:從左
11111111.11000000
或給予一個整數像4,它會寫:
11110000.00000000
謝謝,我仍然學習C,並不熟悉按位運算。
-(1 << wordsize - numbits)
應該這樣做。
查看您的示例中會發生什麼很有意義。 1 << wordsize - numbits
是1 << 12
,這是00010000.00000000
。回顧-x = ~x+1
,我們計算~(1 << 12) = 11101111.111111
。加1,你得到11110000.00000000
。
實際上,它通常是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,它可以讓您輕鬆檢查輸出是否正確。學習按位運算符也是一個很好的練習。
希望它有幫助。
整數通常是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你認爲你從左邊推下去還會在那裏。如果你不需要從左邊偏移,那麼你可以忽略它並剝去右移。
+1很棒的答案 - 真正高效的代碼。 –