将带符号的13位值转换为带符号的16位

问题描述:

从有符号的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

签署类型右移实现定义(在C,至少 - 你实际上并没有提到你所使用的语言在这里),但假设你的编译器就像其他的编译器的99%,而这个签署值的算术右移,那么所有你需要的是:

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

鄂毕真的,你应该测试这个和/或检查你的编译器文档。

[还要注意,这个假设我们正在谈论的2的补码表示的价值观 - 再次它不是在你的问题中指定。]