如何在 C 中将 10 位符号整数转换为 16 位整数



我正在解析一个 10 位有符号整数的数据。由于表示此数据的唯一方法是使用 int 或 short(对于符号 2 字节表示(,因此我必须将 10 位转换为 16 位。 我已经应用了 2 种方法,但它们要么很慢,要么依赖于编译器。

慢速方法是使用pow()函数

value = pow(2,16) - pow(2,10) + value

编译器相关方法是

value = (value << 6) >> 6 (right shift shifts the MSB which is a compiler dependent operation and may shift 0 if compiler is different)

有人可以帮我找到将非标准类型转换为标准类型的标准方法

这是显式写出的操作的逻辑。显然,你可以用一行字来做到这一点,但我希望这能解释为什么

#include <stdio.h>
#include <string.h>
#include <stdint.h>
int main(int argc, char* argv[]) {   
//int16_t  value = 0x3fdb; // random examples
//int16_t  value = 0x00f3;
int16_t  value = 0x3f3;
printf("0x%04x (%i)n", value, value); // in
uint16_t mask  = 0x3ff; // 0000 0011 1111 1111 in binary
uint16_t masked = value & mask; // get only the 10 LSB
uint16_t extension = (0x200 & value) ? 0xFC00 : 0x0; // extend with 1s or 0s
printf("extension: %in", (extension)?1:0);
int16_t  extended = extension | masked; // do the extension
printf("0x%04x (%i)n", extended, extended); // out
return 0;
}

例子:

0x00f3 (243)
extension: 0
0x00f3 (243)
0x3fdb (16347)
extension: 1
0xffffffdb (-37)
0xfffffff3 (-13)
extension: 1
0xfffffff3 (-13)
0x03f3 (1011)
extension: 1
0xfffffff3 (-13)
value = value & 0x03FF; //mask off the high 6 bits like you want.

不应该有 10 位整数,我假设值很短,但您应该添加相关信息。

编辑如果您只想在设置第 10 位时屏蔽,则:

value = (value & 0x0200) ? (value & 0x03FF) : value;

最新更新