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

时间:2013-04-22 09:23:16

标签: bit-manipulation

有没有更好的方法从签名的13位值转换为有符号的16位值,而不是我在下面得到的值?两个值都是16位字,13位值移位3位。

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

1 个答案:

答案 0 :(得分:3)

签名类型的右移是实现定义的(在C中,至少 - 你实际上没有提到你在这里使用的是什么语言),但是假设你的编译器像99%的其他编译器并且做了算术右移有符号值然后你需要的只是:

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

显然你应该对此进行测试和/或检查你的编译器文档。

[另请注意,这假设我们正在讨论值的2的补码表示 - 再次没有在您的问题中指定。]