簡體   English   中英

按位移位澄清

[英]Bitwise Shift Clarification

假設我將變量x初始化為425 二進制形式為110101001

如下將其向右移2位: int a = x >> 2; ,答案是: 106 以二進制形式1101010 這是有道理的,因為最右邊的兩個位被丟棄,而兩個零被添加到左側。

如下將其向左移2位: int a = x << 2; ,答案是: 1700 二進制形式是11010100100 我不明白這是怎么回事。 為什么保留最左邊的兩個位? 我該如何丟棄它們?

謝謝,

這是因為int在您的系統上可能是32位。 (假設x是int類型。)

因此,您的425實際上是:

0000 0000 0000 0000 0000 0001 1010 1001

當左移2時,您將得到:

0000 0000 0000 0000 0000 0110 1010 0100

直到您超過32位,一切都不會改變。(嚴格來說,有符號整數的溢出是C / C ++中的未定義行為)。

要丟棄移位的位,您需要對數字的原始長度的掩碼進行按位與運算:

int a = (425 << 2) & 0x1ff;  //  0x1ff is for 9 bits as the original length of the number.

首先,請不要移位有符號整數。 對於無符號整數類型,按位運算通常是唯一明確的。

其次,如果可以使用* 4/ 4 ,為什么還要平移?

第三,僅當超出類型大小時,才在左側丟棄位。 如果要在數學上“在左側截斷”,請執行模運算:

(x * 4) % 256

按位等效為與(AND),具有以下位模式: (x << 2) & 0xFF

(也就是說,C中的基本無符號整數類型始終隱式為“模2 n ”,其中n是該類型的位數。)

您為什么期望它們被丟棄? 您的int(可能)消耗4個字節。 您正在將它們轉移到正確占用的空間中。

評估期間將占用存儲器中的整個4字節空間。 您需要完全移出內存中的該空間以“刪除”它們。

暫無
暫無

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

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