簡體   English   中英

C中的按位運算:從左側設置位

[英]Bitwise Operations in C: setting bits from left

給定一個像10這樣的整數,我怎么能在總共16位中寫入10位(從左邊開始),如下所示:

11111111.11000000

或者給出一個像4這樣的整數,它會寫:

11110000.00000000

謝謝,我還在學習C並且不熟悉按位操作。

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

看看你的例子中發生了什么是有益的。 1 << wordsize - numbits1 << 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM