2010-09-13 217 views
8

尋求澄清的東西。邏輯,算術按位移

這是我的理解,關於算術,邏輯逐位的變化:

  1. <<工作相同的兩個
  2. >>轉變在邏輯移位與0差異總是會填充字節,而算術移位將填充符號位。

如何區分這使用C?

據我瞭解,實際經營者是同一<<>>

將如何指揮差異之間:

int i=1; 
printf ("%d\n", i >> 1); // logical shift 

int j=1; 
printf ("%d\n", j >> 1); // arithmetical shift 

請讓我知道,

回答

13

在爲非負數的情況下,兩個種類的右移是相同的。只有當移動的數字是負數時纔會出現差異。

實際上C標準沒有指定何時>>執行邏輯或算術移位時,數字是負數,但通常,它執行算術移位。爲了執行邏輯移位,數必須被轉換爲相應的無符號類型,for example

int x = -2; 
int y = x >> 1; // arithmetic shift. 
assert (y == -1); 
int z = (unsigned)x >> 1; // logical shift. 
assert (z == 0x7FFFFFFF); 
+0

有一種方法強制特定偏移。例如,我想(x <<1)>> 1爲了刪除「 - 」符號 – JAM 2010-09-13 18:00:21

+0

@Jerry,@mac:查看更新 – kennytm 2010-09-13 18:02:10

+1

@mac:丟棄符號位與採用絕對位置不一樣值得用補碼 – jamesdlin 2010-09-13 18:05:52