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



是否有一种更漂亮的方式来做从一个有符号的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

有符号类型的右移是实现定义的(至少在C中,你实际上没有提到你在这里使用什么语言),但假设你的编译器像99%的其他编译器一样,对有符号值进行算术右移,那么你所需要的就是:

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

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

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

最新更新