Как получить шестнадцатеричное число из массива 1 и 0 в C? - PullRequest
0 голосов
/ 11 октября 2019

Я создаю программу, которая принимает десятичное число, делает его IEEE-754 форматом с одинарной точностью, затем из знаковых битов, экспонентных битов и битов мантиссы создает шестнадцатеричное число длины 8. Я не могучтобы преобразовать массив int, который я сделал, состоящий из всех необходимых битов, в шестнадцатеричный формат.

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

void printHexChar(unsigned char value){
    unsigned char lower = value & 0xf; // Use binary 'and' to mask the lower byte
    unsigned char upper = (value & 0xf0) >> 4; // Use binary 'and' to mask upper byte

 if(upper >= 10) // Same as lower
        upper = 'a' + (upper - 10);
    else
        upper = upper + '0';
    if(lower >= 10) // If lower is in range [10-15], than add a value [0-5] on 'a'.
        lower = 'a' + (lower - 10);
    else
        lower = lower + '0'; // It's in range [0-9], so we have to add it to '0'.






    printf("%c%c",lower,upper); // Print out the hexadecimal number
}
void bin_array_to_hex(int *b, int length){
    if(length % 8){
        printf("Must be dividable by eight!\n");
        return;
    }
    unsigned int i;
    unsigned int j;
    for(i = 0; i < length; i = j){
        unsigned char a = 0; // Has length of 8 bits
        for(j = i; j < i+8; ++j){ // take 8 bits...
            a |= b[j]<<(j-i); // and set them in a

        }
       printHexChar(a);
    }           
}
bin_array_to_hex(arrayhex2, 32); 

Я ожидаю, что ввод 2,5 будет 40200000, но это 00000204. массив зависит от введенного числа с плавающей запятой, но для 2.5 это 01000000001000000000000000000000.

1 Ответ

1 голос
/ 11 октября 2019

Теперь, когда у нас есть все вместе, я могу показать вам решение. Однако я не буду объяснять код котельной пластины вокруг соответствующей части.

Поскольку ваш массив содержит все биты в последовательности, вы можете просто сдвинуть их один за другим в переменную назначения. Я назвал это value. Он должен быть инициализирован на тот случай, если заданы не все биты.

#include <stdio.h>

int array[] = {
    0, 1, 0, 0, 0, 0, 0, 0,
    0, 0, 1, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
};

void bin_array_to_hex(int *b, int length) {
    if (length % 8) {
        printf("Length must be dividable by eight!\n");
        return;
    }
    unsigned int value = 0;
    if (length / 8 > sizeof value) {
        printf("Length must be <= %u!\n", 8 * (unsigned int)sizeof value);
        return;
    }
    while (length--) {
        value <<= 1;
        if (*b) {
            value |= 1;
        }
        b++;
    }
    printf("%08x\n", value);
}

int main(void) {
    bin_array_to_hex(array, sizeof array / sizeof array[0]);
    return 0;
}

Еще несколько замечаний:

  • Нет необходимости в дополнительных локальных переменных. Параметры можно рассматривать как локальные переменные, на самом деле они обрабатываются очень похоже в обычных условиях. Поэтому мы можем использовать их (здесь: b и length) напрямую.
  • Вам не нужен самодельный шестнадцатеричный принтер. printf() может сделать это для вас. Если вам нужен результат в строке, используйте sprintf().
...