2017-08-06 47 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是學習位操作的好地方。

相關問題