2011-09-23 39 views
1

對於這個任務,我只能使用基本的按位運算符和沒有控制結構,所以我已經拿出這個代碼到目前爲止將符號大小轉換爲two's complement從符號幅度轉換爲二進制補碼

int sm2tc(int x) { 
    // Invert and add 1 
    // Problem: sm has 2 zeros.. 1000...000 & 0000...000 
    int tmin = 1 << 31; 
    int mask = x >> 31; // Determine sign of x 
    int mask2 = ~tmin; // Negate tmin to get 0111111... 
    int first = (x^mask) + (~mask + 1) ; 
    int second = first & mask2; // Turns of MSB 
    return second; 
} 

我哪裏出錯了?

+0

你不應該依賴32位的int。使用'int32_t'確定('stdint.h')。 – 2011-09-23 20:10:36

+0

該代碼正在32位Linux機器上運行,用於評分和在我的機器上運行。如果我希望這是可移植的,我想我可以使用(sizeof(int)* CHAR_BIT - 1)來存儲位值。 – tippenein

+0

如果練習的目的是爲了具有良好定義的位操作並對位進行簽名,你應該使用無符號類型。 –

回答

2

所以,你真的要計算的是

result = (x & sign_bit) ? -(x & ~sign_bit) : x; 

但是,當然,你不允許控制結構。第一步是使用+^運營商:(-1^(x & ~sign_bit)) - -1重寫-(x & ~sign_bit)。現在請注意,如果(x & sign_bit)爲零,則(0^(x & ~sign_bit)) - 0等於x。我們現在有

result = (x & sign_bit) ? (-1^(x & ~sign_bit)) - -1 : (0^(x & ~sign_bit)) - 0 

,那麼你只需要更換-10與生成依賴於符號位的值的x功能,你瞧條件的雙方成爲同樣的表情和狀態變得不必要。

+0

您假設底層平臺基於2的補碼錶示。你爲什麼做這個假設?你爲什麼不假定這個平臺實際上是基於數量級的?我想說,針對這個特定問題的「乾淨」解決方案不應該依賴任何平臺的細節。例如,您的原始表達式在符號量級的平臺上是無操作的。 – AnT

+0

我們在OP的文章中看到的是明確嘗試製作獨立於平臺的解決方案。所以,你所做的並不完全是OP所需要的。換句話說,你不能依賴'-x'產生2的補碼錶示,即一元'-'被禁止。 – AnT

+0

你的解釋很棒。我所要做的就是將我將MSB解除固定的行切換到實際轉換之前 – tippenein

相關問題