2017-08-06 44 views
0

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

“二元”是什么意思?真/假,还是某种位掩码?如果您展示您正在尝试执行的相关代码示例,也许会更容易。 – Evert

+0

我的意思是在1和0的32位字符串中。我试图存储在一个unsigned int。我会尽量把它放在我的代码中,但我认为这是完全错误的。 – danielwestfall

+3

请编辑你的问题,并给出一个最小的例子,包括观察和预期的输出。 – datell

回答

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); 
} 
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是学习位操作的好地方。

相关问题