2013-04-22 50 views
0

從有符號的13位值轉換爲帶符號的16位值是否比下面介紹的有更漂亮的方式?兩個值都位於16位字中,13位值被移位3位。將帶符號的13位值轉換爲帶符號的16位

S = Sign, O = Value bit, X = Unused 
a is the signed 13-bit | SOOO OOOO OOOO OXXX 
b is the signed 16-bit | SOOO OOOO OOOO OOOO 

當前實現

b = a & 0x7FF8;  // Remove sign   XOOO OOOO OOOO OXXX 
b = b >> 3;   // Shift value 3 bit XXXO OOOO OOOO OOOO 
b = b | (a & 0x8000); // Add sign   SXXO OOOO OOOO OOOO 
+0

是否得到編譯成?我已經看到編譯器爲我的凡人的大腦無法理解的事情做了一些棘手的優化。另外我想你所瞄準的架構可能會有所幫助。你總是可以用cs13bvts16b指令來定位一些CISC,並且永遠不會知道它... – 2013-04-22 09:25:26

+0

你能否確認我們正在討論(a)2的補碼錶示和(b)C(或者一個緊密相關的語言)? – 2013-04-22 09:47:34

+0

@PaulR a)你說得對,它是2的補充,b)我只是輸入了一些僞C,因爲我正在尋求一個通用的解決方案,我的實現將使用結構化文本。 – ihatetoregister 2013-04-22 10:13:22

回答

3

簽署類型右移實現定義(在C,至少 - 你實際上並沒有提到你所使用的語言在這裏),但假設你的編譯器就像其他的編譯器的99%,而這個簽署值的算術右移,那麼所有你需要的是:

b = a >> 3; // Syyy yyyy yyyy yxxx => SSSS yyyy yyyy yyyy 

鄂畢真的,你應該測試這個和/或檢查你的編譯器文檔。

[還要注意,這個假設我們正在談論的2的補碼錶示的價值觀 - 再次它不是在你的問題中指定。]

相關問題