有(至少)两种基本方法。一种是创建一个带有一些位域的结构:
struct bits {
unsigned a : 1;
unsigned b : 7;
unsigned c : 4;
unsigned d : 3;
unsigned e : 1;
};
bits b;
b.a = val1;
b.b = val2;
b.c = val3;
b.d = val4;
b.e = val5;
要获得 16 位值,您可以(例如)创建该结构与uint16_t
. 只有一个小问题:当您查看 16 位值时,该标准不保证位字段的最终顺序。举例来说,您可能需要颠倒我上面给出的顺序,以获得您真正想要的从最高有效位到最低有效位的顺序(但更改编译器可能会再次搞砸)。
另一个明显的可能性是使用移位和掩码将各个部分组合成一个数字:
int16_t result = val1 | (val2 << 1) | (val3 << 8) | (val4 << 12) | (val5 << 15);
目前,我假设每个输入都在正确的范围内开始(即,具有可以用所选位数表示的值)。如果有可能是错误的,您需要先将其屏蔽为正确的位数。通常的方法是:
uint16_t result = input & ((1 << num_bits) - 1);
如果您对那里的数学感到好奇,它的工作原理是这样的。假设我们要确保输入适合 4 位。左移1
4 位产生00010000
(二进制)。从中减去一位,然后清除设置的一位,并设置所有低于该位的有效位,00001111
例如我们的示例。这给了我们第一个最低有效位集。当我们AND
在它和输入之间进行逐位处理时,输入中设置的任何高位都会在结果中被清除。