将二进制值存储到unsigned int数组中

时间:2017-08-06 11:34:46

标签: c arrays binary unsigned-integer

我在将二进制值存储到unsigned int数组时遇到了一些麻烦。我试图将二进制表示作为char数组传递,但它并没有像我希望的那样工作。我正在做的是使用char循环遍历while数组,并将每个数字分配给unsigned int数组的元素,但这是完全错误的。我非常想知道如何将二进制值存储到unsigned int中。如何在前面显示零?我尝试将数组中的二进制值放在前面没有0 s,但这不起作用。我可以将二进制值转换为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数组。

2 个答案:

答案 0 :(得分:0)

这是你的(设定)功能:

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);
}

答案 1 :(得分:0)

您可能正在寻找一个函数来设置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是学习位操作的好地方。