【问题标题】:Storing a Binary Value into an unsigned int array将二进制值存储到无符号整数数组中
【发布时间】:2017-08-06 11:34:45
【问题描述】:

我在将二进制值存储到unsigned int 数组中时遇到了一些问题。我试图将二进制表示作为char 数组传递,但是它没有像我希望的那样工作。我正在做的是使用while 循环遍历char 数组并将每个数字分配给unsigned int 数组的一个元素,但这是完全错误的。我只是非常想知道如何将二进制值存储到unsigned int 中。如何在前面显示零?我已经尝试将没有0s 的二进制值放入数组中,但这不起作用。我可以将二进制文件转换为int 值,然后在打印时将其转换回来吗?

这是函数的基本代码

void setstring(unsigned int array[10], char *bitString) {
    len=strlen(bitString);
    for (int i=1; i<=10; i++) {
        for (int p=1; d%32!=0; d++) {
             array[10-i]=bitString[len-];
        }
    }
}

打印只是为了打印bitString 或数组,但目前根本没有打印任何内容。打印只是一个for 循环,它遍历unsigned int 数组。

【问题讨论】:

  • “二进制”是什么意思?真/假,还是某种位掩码?如果您显示您正在尝试做的相关代码示例,也许会更容易。
  • 我的意思是在 1 和 0 的 32 位字符串中。我正在尝试存储在无符号整数中。我会尝试把它放在我的代码中,但我认为这是完全错误的。
  • 请编辑您的问题并给出一个最小示例,包括观察到的和预期的输出。
  • @danielwestfall 发布您的代码,即使它是错误的。这样我们就可以回答您的问题,而不是猜测您的意思
  • array[10-i]=bitString[len-p); 肯定不是真正的可编译代码:) vs ]。还有什么不是真正的代码?

标签: c arrays binary unsigned-integer


【解决方案1】:

您可能正在寻找一个函数来设置unsigned char 变量的特定位。

尝试使用它来设置位

void setBit(unsigned char *target, int pos)
{
    //pos must be < sizeof(unsigned char)
    unsigned char mask=1<<pos;
    *target = *target | mask;
}


这将取消设置位

void unsetBit(unsigned char *target, int pos)
{
    unsigned char mask=~(1<<pos);
    *target = *target & mask;
}

请注意,pos0 开头。

您可以使用这些函数来显示位:

int getBit(unsigned char target, int pos)
{
    target = target>>pos;
    return target & 1;

}

void printBits(unsigned char target)
{
    int i;
    for(i=sizeof(target)*8-1; i>=0; --i)
    {
        printf("%d", getBit(target, i));
    }
}

在这些函数中,目标变量通过引用传递。

例子:

unsigned char a=0;
setBit(&a, 0);
setBit(&a, 1);
setBit(&a, 6);
printf("\nBit pattern is: ");
printBits(a);
printf(". Value is %d.", a);

会打印

Bit pattern is: 01000011. Value is 67.

进一步

unsetBit(&a, 1);
printf("\nBit pattern is: ");
printBits(a);
printf(". Value is %d.", a);

会给

Bit pattern is: 01000001. Value is 65.

编辑:This 是学习位操作的好地方。

【讨论】:

    【解决方案2】:

    这是您的(一组)功能:

    int binary_string_to_integer(const char *str, unsigned int *vl)
    {
        unsigned int value = 0;
        int result = 0;
    
        if (str == NULL || vl == NULL || !strlen(str)) result = -1;
        if (!result)
        {
            while (!result && *str)
            {
                if (*str != '1' && *str != '0')
                {
                    result = -1;
                }
                value <<= 1;
                value += (*str++ == '1');
            }
        }
        if (!result) *vl = value;
        return result;
    }
    

    int binary_string_to_integer_array_of_0_or_1(const char *str, int *vl, int skipzeroes)
    {
        int result = 0;
    
        if (str == NULL || vl == NULL || !strlen(str)) result = -1;
        if (!result)
        {
            while (*str)
            {
                if (*str != '1' && *str != '0')
                {
                    result = -1;
                    break;
                }
                if (skipzeroes && !result && *str == '0')
                {
                    str++;
                    continue;
                }
                *(vl + result++) = (*str++ == '1');
            }
        }
        return result;
    }
    

    char *reverse(char *str)
    {
        char tmp;
        size_t len;
    
        if (str != NULL)
        {
            len = strlen(str);
            for (size_t i = 0; i < len / 2; i++)
            {
                tmp = *(str + i);
                *(str + i) = *(str + len - i - 1);
                *(str + len - i - 1) = tmp;
    
            }
        }
        return str;
    }
    
    char *uint_to_binary_string(unsigned int vl, char *buff)
    {
        char *ptr = buff;
    
        if (buff != NULL)
        {
            while (vl)
            {
                *ptr++ = '0' + (vl & 1);
                vl >>= 1;
            }
        }
        *ptr = 0;
        return reverse(buff);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      相关资源
      最近更新 更多