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

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

for(char c = 'a'; c <= 'z'; c++){
    cout << hex << (int)c;
}

Но я не могу сделать то же самое для двоичного файла. Нет std::bin, который я мог бы использовать для преобразования десятичных чисел в двоичные.

Ответы [ 6 ]

48 голосов
/ 27 января 2009

Вроде так:

for(char c = 'a'; c <= 'z'; c++){
        std::bitset<sizeof(char) * CHAR_BIT> binary(c); //sizeof() returns bytes, not bits!
        std::cout << "Letter: " << c << "\t";
        std::cout << "Hex: " << std::hex << (int)c << "\t";
        std::cout << "Binary: " << binary << std::endl;
    }
5 голосов
/ 27 января 2009

В C ++ нет бинарного манипулятора io. Вам необходимо выполнить покрытие вручную, возможно, используя операторы битового сдвига. Фактическое преобразование не является сложной задачей, поэтому должно быть в пределах возможностей начинающего пользователя в C ++ (тогда как тот факт, что он не включен в стандартную библиотеку, может не быть:))

Редактировать: многие другие приводили примеры, поэтому я собираюсь дать свой предпочтительный метод

void OutputBinary(std::ostream& out, char character)
{
  for (int i = sizeof(character) - 1; i >= 0; --i)
  {
    out << (character >> i) & 1;
  }
}

Это также может быть потенциальным шаблоном для любого числового типа.

4 голосов
/ 27 января 2009

Для разнообразия, вы также можете сделать это с помощью таблицы поиска из 16 элементов.

2 голосов
/ 27 января 2009

Вы можете легко написать отображение между шестнадцатеричными символами и их двоичными «полубайтами»:

std::string HexCharToNibble( char c ) {
switch (c) {
  case '0': return "0000";
  case '1': return "0001";
  //... fill in the rest
  case 'f': return "1111";
  default: assert(false); return "bad input";
};
1 голос
/ 27 января 2009

Вы можете сделать что-то вроде этого:

for(char c = 'a'; c <= 'z'; c++){
    // char is 8 bits.  print 4 bits
    // at a time, starting with the MSB
    for (int i = 4; i>=0; i-=4) {
        switch (((int)c >> i) & 0xf) {
            case 0:
                cout << "0000";
                break;
            case 1:
                cout << "0001";
                break;
            .
            .
            .
            case 0xf:
                cout << "1111";
                break;


        }
    }
}
0 голосов
/ 27 января 2009

Это звучит как задание, и в этом случае вам действительно следует обратиться к учителю за помощью. Поиск решений для домашней работы из Интернета на самом деле не поможет вам в долгосрочной перспективе (если вы не собираетесь заниматься управлением проектами).

Отвечая на вопросы chustar (OQ'er) в комментариях, я должен согласиться с тем, что если вы понимаете, как это сделать, как / почему это работает, и как самим разобраться в будущем, то да, это было бы хорошо.

Однако ответ, который он пометил как «правильный», ложь к этому аргументу. Он не содержит ничего, кроме кода, предваряемого словами «Как так». Совершенно очевидно, что OQ'er искал не для объяснения, а для того, чтобы кто-то написал свой код для него.

...