对于我正在处理的项目,“字”的长度定义为10位,并且根据我的程序的工作,我需要用二进制数字更新该字中的特定位(当然,最大位数为位的长度)。我的问题是我不知道如何创建这些位,以及之后如何读取它们。
例如,“ word”设置如下:
bits 0-1 - representing something A - can get values between 0-3.
bits 2-3 - representing something B - can get values between 0-3.
bits 4-5 - C - values 0-3.
bits 6-9 - D - values 0-15.
在程序运行时,我需要决定在每组位中填充什么。之后,当我的单词完全充满时,我需要分析结果,即遍历整个单词,并从0-1位理解A代表什么,从2-3位理解B代表什么,依此类推。 ..
另一个问题是,第9位是最高有效位,这意味着该字从6-9到4-5填充到2-3到0-1,然后从第9到0打印出来,而不是作为常规数组。
我试图用位域的结构来完成此操作,但是问题是,尽管“字”始终为10位长,但上述细分只是“字”的一个示例。也可能是位0-1代表某些东西,位2-9代表其他东西。
我有点迷茫,不知道该怎么做,如果有人可以帮助我,我会很高兴。
谢谢!
最佳答案
只需将一个“单词”建模为uint16_t
,然后设置适当的位。
像这样:
typedef uint16_t word;
word word_set_A(word w, uint8_t a)
{
w &= ~3;
return w | (a & 3);
}
uint8_t word_get_A(word w)
{
return w & 3;
}
word word_set_B(word w, uint8_t b)
{
w &= ~0xc0;
return w | ((b & 3) << 2);
}
... 等等。