[英]Bitwise Operations in C: setting bits from left
給定一個像10這樣的整數,我怎么能在總共16位中寫入10位(從左邊開始),如下所示:
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
。
實際上,int通常是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仍然會在那里。 如果您不需要從左側偏移,那么您可以忽略它並去除右移。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.