Массив в шестнадцатеричное представление - PullRequest
2 голосов
/ 29 сентября 2010

Я пишу программу, которая должна взять массив размера n и преобразовать его в шестнадцатеричное значение следующим образом:

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

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

0x6000000000000000; // 0110...0

он также должен быть упакован справа от 0 до 64 бит (я на 64-битной машине).

Или я мог бы также взять элементы массива, преобразовать их в десятичные и преобразовать в шестнадцатеричные, если это проще ... Какой вам лучший способ сделать это в C ++?

(это не домашняя работа)

Ответы [ 5 ]

4 голосов
/ 29 сентября 2010

Далее предполагается, что ваш a[] будет когда-либо использовать только 0 и 1 для представления битов.Вам также нужно будет указать длину массива, в этом случае можно использовать sizeof(a)/sizeof(int), но не для выделенных массивов кучи.Кроме того, result должен быть 64-битным целочисленным типом.

for (int c=0; c<array_len; c++)
  result |= a[c] << (63-c);

Если вы хотите увидеть, как он выглядит в шестнадцатеричном виде, вы можете использовать (s)printf( "%I64x", result )

1 голос
/ 29 сентября 2010
unsigned long long answer= 0;
for (int i= 0; i<sizeof(a)/sizeof(a[0]); ++i)
{
    answer= (answer << 1) | a[i];
}

answer<<= (64 - sizeof(a)/sizeof(a[0]));

Допущения: a[] не более 64 записей, определяется во время компиляции и содержит только 1 или 0.Будучи определенным во время компиляции, обходится без проблем смещения влево на 64, поскольку вы не можете объявить пустой массив.

1 голос
/ 29 сентября 2010

std::bitset<64>::to_ulong() может быть вашим другом.Порядок, вероятно, будет обратным (он не указан, но обычно индекс 3 выбирается путем смещения слова вправо на 3 и маскирования с 1), но вы можете исправить это, вычтя нужный индекс из 63.*

0 голосов
/ 29 сентября 2010

байт hexValues ​​[16];

для (int i = 15; i> = 0; i--) { hexValues ​​= a [i * 4] * 8 + a [i * 4-1] * 4 + [i * 4-2] * 2 + a [i * 4-3]; }

Это даст вам массив байтов, где каждый байт представляет одно из ваших шестнадцатеричных значений.

Обратите внимание, что каждый байт в hexValues ​​будет иметь значение от 0 до 16.

0 голосов
/ 29 сентября 2010

Вот грубый ответ:

int ConvertBitArrayToInt64(int a[])
{
    int answer = 0;

    for(int i=0; i<64; ++i)
    {
        if (isValidIndex(i))
        {
            answer = answer << 1 | a[i];
        }
        else
        {
            answer = answer << 1;
        }
    }
    return answer;
}
...