2010-09-29 2 views
2

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

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

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

0x6000000000000000; // 0110...0

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

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

(это не домашнее задание)

ответ

4

Предполагается, что ваш 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)

+0

необходимо вычесть из 63 ... сдвиг на 64 определяется реализацией. – Potatoswatter

+0

@Potatoswatter хороший улов, отредактированный. –

+0

Спасибо, это отлично работает. Я должен был сделать тип результата без знака длинным долго и также использовать a [c] для unsigned long long. Благодаря! – gprime

0

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

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; 
} 
+0

Что такое 'isValidIndex()'? – Arun

+0

Это функция, в которой у нас недостаточно информации из исходного вопроса для реализации. Реализация (или, скорее, подходящая замена) оставлена ​​в качестве упражнения для исполнителя. – abelenky

1

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

#include <bitset> 

std::bitset<64> bits; 

for (int index = 0; index < sizeof a/sizeof *a, ++ index) { 
    bits[ 63 - index ] = a[ index ]; 
} 

std::cout << std::hex << std::setw(64) << std::setfill('0') 
      << bits.to_ulong() << std::endl; 
+0

Я думаю, он пытается сгенерировать 'unsigned long' из массива' int'. Ему не нужно переходить в «битет» (я уже отбросил эту идею, но, возможно, я неправильно понял вопрос). –

+0

@Mark: Да, я отредактировал ответ, чтобы изменить этот смысл. 'bitset' работает в обоих направлениях. – Potatoswatter

+0

+1 но мне было интересно, работает ли 'std :: copy' с' bitset'? –

0

байт hexValues ​​[16];

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

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

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

1
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, так как вы не можете объявить пустой массив.

+0

Он может содержать более 64 записей, но мне это нравится – gprime

+0

@gprime, если у него более 64 записей, каково ожидаемое поведение? – MSN

+0

никогда не будет больше, чем 64 ... я бы хотел использовать другую структуру данных, если бы захотел. Но я закодировал в свою программу, чтобы не пытаться выполнять вычисления, если это больше, чем 64. – gprime

Смежные вопросы