[英]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.