簡體   English   中英

C中的左移操作

[英]Left bit shift operation in C

我正在嘗試將具有值1111的變量'a'移至左側,以便獲得1110,表示它應打印數字14。但是,它正在打印30。我在想,因為它是移位,但它不需要花掉最多的位(11110),但應該是1110。這是我的代碼。 謝謝。

int main(int argc, char *argv[]) {
unsigned a;
a=0xF;
a=a<<1; 
printf(": %u\n",a);

a變量被聲明為unsigned -這意味着它是一個unsigned int ,通常有32位。 因此,當您將0xF放入其中時,它實際上包含0x0000000F ,或者

00000000000000000000000000001111

以二進制形式。

當您將那個位置向左移動時,它包含

00000000000000000000000000011110

或十進制的30。 (十六進制為0x1e)

如果要將其限制為僅4位,則需要在每次移位操作之后將結果與0xF進行AND運算,例如

a = a << 1;
a = a & 0xF;

這將導致a只包含1110 (但確實含有00000000000000000000000000001110

首先, unsignedunsigned int縮寫,在大多數現代系統中,將int定義為4個字節(32位)。 無論如何,它肯定超過4位。

您說對了,“它不會花掉最左邊的部分”。

如果你願意,你可以按位&與它0xF將任何位設置為最后4位的左側0

a = (a << 1) & 0xF;

當您左移一個數字時,最左邊的位不會丟失,它只會向左移動。 因此,當您左移1111時,您將得到11110。為方便起見,您可以記住,每當左移一個數字時,它就會乘以2;當您右移時,實際上是將其除以2。下降只會發生如果您分配的位類型用完了該數字。 在這種情況下,您將獲得垃圾值作為答案。 因此,根據您的操作,您的輸出是正確的。 但是,如果您想從15中獲得14,我建議您使用減法。

向左移動1111會得到11110,的確是30。嘗試閱讀這個對相關問題的非常好的答案,我想您對位移位的想法不正確。 什么是按位移位(bit-shift)運算符,它們如何工作?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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