有没有更好的方法从签名的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
答案 0 :(得分:3)
签名类型的右移是实现定义的(在C中,至少 - 你实际上没有提到你在这里使用的是什么语言),但是假设你的编译器像99%的其他编译器并且做了算术右移有符号值然后你需要的只是:
b = a >> 3; // Syyy yyyy yyyy yxxx => SSSS yyyy yyyy yyyy
显然你应该对此进行测试和/或检查你的编译器文档。
[另请注意,这假设我们正在讨论值的2的补码表示 - 再次没有在您的问题中指定。]