Как преобразовать шестнадцатеричные числа в двоичные в C++?

StackOverflow https://stackoverflow.com/questions/483609

  •  20-08-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Вот так:

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

Другие советы

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

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

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

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

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

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

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";
};

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

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;


        }
    }
}

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top