0

有没有比我下面得到的更漂亮的方法来将有符号的 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
4

1 回答 1

3

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

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

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

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

于 2013-04-22T09:42:33.787 回答