C:解包一个字节

时间:2010-03-07 08:07:55

标签: c bytearray bit-manipulation

我问了问题here,现在我想颠倒这个程序

我有一个表示位模式的无符号短路,我想要一个bool [16]数组,对无符号短路中的相应位设置为true或false。

到目前为止我已经

其中二进制2是无符号短整数,具有我希望解包的位模式。

unsigned short i;
i = 1<<(sizeof(unsigned short) * 8 - 1);

while (i > 0) {
    if (binary2 & i)
        printf("1");
    else
        printf("0");
    i >>= 1;
}

但我似乎错过了我的模式中的第一位并转移了剩余的那些。

5 个答案:

答案 0 :(得分:3)

 void get_bits(uint16_t pattern, bool bits[16]) {
    for (int i = 0; i < 16; ++ i)
      bits[i] = (pattern & 1 << i) != 0;
 }

union bit16 {
    uint16_t bit_pattern;
    struct {
        int bit0 : 1;
        int bit1 : 1;
        int bit2 : 1;
        int bit3 : 1;
        int bit4 : 1;
        int bit5 : 1;
        int bit6 : 1;
        int bit7 : 1;
        int bit8 : 1;
        int bit9 : 1;
        int bit10 : 1;
        int bit11 : 1;
        int bit12 : 1;
        int bit13 : 1;
        int bit14 : 1;
        int bit15 : 1;
    } bits;
};

答案 1 :(得分:2)

这是怎么回事。

void ExtractBits(int pattern, int array[16])
{
   for (int ii = 0; ii < 16; ++ii)
   {
      array[ii] = pattern & 1;
      pattern = pattern >> 1;
   }
}

答案 2 :(得分:0)

不是最好的代码,但它可以胜任。你知道快速和肮脏的东西:)

typedef unsigned short int Word;

bool get_bit(Word word, size_t pos)
{
    return (word &= (1 << pos));
}

void unpack_word(Word word, bool unpacked_bits[])
{
    for(size_t i = 0; i < sizeof(Word)*CHAR_BIT; ++i)
        unpacked_bits[i] = get_bit(word, i);
}

int main()
{
    Word w = 0xF0FF;
    bool bits[sizeof(Word)*CHAR_BIT];
    unpack_word(w, bits);
}

答案 3 :(得分:0)

我真的不明白为什么你会这样做,因为它听起来很慢,但执行它的代码应该是相当直接的。让我先验证一下,我明白你要做什么。你有一个unsigned short和一系列bool。你想把短片中的每一位提取成一个布尔。正确?如果是这样,那应该是你想要的:

unsigned short bitmask = (some mask);
bool bools[sizeof(unsigned short) * 8];
for(unsigned short i = 0; i < sizeof(unsigned short) * 8; ++i)
{
    unsigned short bit = 1 << i;
    bools[i] = bitmask & bit;
}

根据您的应用程序实际执行的操作,我强烈建议对每个位使用枚举,而不是使用bools,只需对枚举执行按位和操作以获取该位的值。您必须小心使用按位操作,因为它们在CPU上可能非常慢。

此外,我强烈建议不要使用Kenny在部分答案中显示的位域,因为我从未使用过bitfields速度不会非常慢的处理器。

答案 4 :(得分:0)

所以你需要这样的东西;

  for(i = 1, j = 0; i != 0x10000; i <<= 1, ++j)
    result[j] = (binary2 & i) > 0;

例如:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

bool result[16];

void try(unsigned short binary2) {
  int i,j;

  for(i = 1, j = 0; i != 0x10000; i <<= 1, ++j)
    result[j] = (binary2 & i) > 0;
}

int main(int ac, char **av) {
  int i;

  if (ac > 1)
    try(atoi(av[1]));
  for(i = 15; i >= 0; --i)
    printf("%c", result[i]["ft"]);
  printf("\n");
  return 0;
}