C - 使用string / int的特定位

时间:2017-09-04 09:21:30

标签: c bit-manipulation c89

对于我正在进行的项目,一个“字”定义为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代表什么,从B-2代表的位2-3,依此类推..

另一个问题是第9位是最高位,这意味着该字从第6-9位到第4-5位填充到2-3到0-1,之后从第9位打印到0 ,而不是常规数组。

我尝试用位域结构来做,但问题是虽然“字”总是10位长,但如上所述的细分只是“字”的一个例子。它也可以是0-1代表某些东西,而2-9代码则是其他东西。

我有点失落,不知道怎么做,如果有人可以帮助我,我会很高兴的。 谢谢!

1 个答案:

答案 0 :(得分:1)

只需模拟一个"字"作为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);
}

......等等。