Преобразовать десятичное число, сохраненное в массиве, в двоичное число, сохраненное в массиве, и наоборот - PullRequest
2 голосов
/ 21 апреля 2020

Я исследовал способы преобразования десятичного числа в двоичное число. Однако в примерах я нахожу, что преобразовываемое десятичное число находится не в массиве. Например:

void decToBinary(int n) 
{ 
    // array to store binary number 
    int binaryNum[32]; 

    // counter for binary array 
    int i = 0; 
    while (n > 0) { 

        // storing remainder in binary array 
        binaryNum[i] = n % 2; 
        n = n / 2; 
        i++; 
    } 
}

В моем случае, однако, у меня есть десятичное число, сохраненное в массиве uint8_t * (генерируется случайным образом), как вы можете передать его двоичному числу, сохраненному в массиве? А потом, как я мог передать его обратно к десятичному числу, сохраненному в массиве?

1 Ответ

1 голос
/ 21 апреля 2020

Вы должны вернуть binaryNum, потому что это локальная переменная. Но, во-первых, вы должны вернуть массив для точного двоичного числа:

uint8_t * returArray;
returArray = malloc(sizeof(int) * i);

for(int j = i - 1, k = 0; j >= 0; j--, k++) {
    returArray[j] = binaryNum[k];
}

Функция становится такой:

uint8_t * decToBinary(int n, int *size) 
{ 
    // array to store binary number 
    int binaryNum[32];
    uint8_t * returArray;

    // counter for binary array 
    int i = 0; 
    while (n > 0) { 

        // storing remainder in binary array 
        binaryNum[i] = n % 2; 
        n = n / 2; 
        i++; 
    } 

    returArray = malloc(sizeof(int) * i);
    if (!returArray)
       // handle error;

    for(int j = i - 1, k = 0; j >= 0; j--, k++) {
        returArray[j] = binaryNum[k];
    }
    *size = i;
    return returArray;
}

size значение - это размер двоичного массива.

Основное для теста:

int main(void) {
    int size;
    uint8_t * a = decToBinary(25, &size);
    printf("size = %d\n", size);
    for (int i = 0; i < size; ++i)
    {
        printf("%d", a[i]);
    }
    free(a);
    return 0;
}

Если вы хотите преобразовать обратно в десятичное, вам нужно сделать что-то обратное, как вы преобразовываете десятичное в двоичное:

int main() {
   ...
   int decimal = 0;
   int base = 1;
   for (int i = size-1; i >= 0; i--)
   {
       decimal += base * a[i];
       base *= 2;
   }
}

Обновление для преобразования всех значений в массиве:

uint8_t * converAll(int * decimalArr, int size, int *new_size) {
    uint8_t * returArray = malloc(sizeof(uint8_t));
    if(! returArray) {
        // handle error
    }
    int bsize;
    int temp = 0, k = 0;
    for (int i = 0; i < size; ++i)
    {
       uint8_t *arr = decToBinary(decimalArr[i], &bsize);
       returArray = realloc(returArray ,sizeof(uint8_t) * (bsize + temp));
       if(! returArray) {
        // handle error
       }
       for (int j = 0; j < bsize; j++) {
            returArray[k] = arr[j];
            k++;
       }
       temp += bsize;
    }
    *new_size = k;

    return returArray;
}

Эту функцию можно использовать как:

int arr[] = {3,6,3,8,9,4};
uint8_t * a = converAll(arr, 6,  &size);
...