Member 13899738 Ответов: 5

Проблема преобразования десятичной системы счисления в шестнадцатеричную C++


Попытка создать программу, которая преобразует десятичную дробь в шестнадцатеричную строку без использования std::hex. Когда происходит преобразование, он возвращает перевернутую версию правильного ответа для шестнадцатеричного числа

Например : 100(десятичное число) преобразуется в 46 вместо 64(правильное шестнадцатеричное число).

Я не могу придумать решение этой проблемы.

int i;
int temp;
string hex;
long totalDecimal;
cin >> totalDecimal;

for (i = 0; totalDecimal != 0; i++)
{
    temp = totalDecimal % 16;

    if (temp > 10)
    {
        hex += temp + 55;
    }
    else
    {
        hex += temp + 48;
    }
    totalDecimal = totalDecimal / 16;
}

cout << hex;
return 0;


Что я уже пробовал:

создание hex-хранилища массива, например hex[100] , и использование циклов for для присвоения значений каждому элементу массива, но это только сделало его гораздо более запутанным и сложным

5 Ответов

Рейтинг:
28

User 7429338

Давайте посмотрим, что происходит:

Итерация 1:
totalDecimal = 100
totalDecimal%16 = 4
hex = "4"

Итерация 2:
totaldecimal = 6 (100/16)
totalDecimal%16 = 6
hex = "46"

Таким образом, каждую итерацию вы делите на 16 (идя справа налево), но добавляете в конец своей строки (слева направо).
Вы можете исправить это, добавив к своей строке справа налево:

string hex = "";
...
    if (temp > 10)
    {
        hex.insert(0, 1, temp + 55);
    }
    else
    {
        hex.insert(0, 1, temp + 48);
    }


Member 13899738

Спасибо Вам за ответ! Однако, когда я пытаюсь использовать hex = (temp + 55) + hex, компилятор утверждает, что "нет оператора'+', соответствующего этим операндам". Как я могу решить эту проблему?

[no name]

Вы правы, прошло уже много времени с тех пор, как я печатал C++ :) Пожалуйста, смотрите мою правку.

megaadam

hex = char(temp + 55) + hex;

megaadam

или...
просто сделайте это в конце вашего первоначального решения.
hex = std::reverse(hex);
Вам также нужно #include <algorithm>

Рейтинг:
2

OriginalGriff

У вас есть два варианта:
1) сохраните шестнадцатеричные цифры и позже отобразите их в обратном порядке.
2) сначала работайте с наиболее значимой цифры.

Option2 не так плох, как кажется, не совсем так.
1) Установите логическое значение под названием "leadingZero" и установите его в true
2) установите счетчик сдвигов, установите его равным 28 (для 32 - битных чисел, 60 для 64-битных)
3) петля, хотя все цифры.
3.1) сдвиньте входной сигнал на количество бит сдвига, используя оператор >> и замаскируйте его до цифры:

digit = (input >> shiftCount) & 0xF;

3.2) если цифра не равна нулю или leadignZero является ложной, выведите цифру. Набор нуля, чтобы ложные
3.3) уменьшите shiftCount на 4 и вернитесь к 3.1


Member 13899738

Я ценю 2 различных варианта, которые вы дали! Однако я пытаюсь заставить функцию возвращать шестнадцатеричные цифры вместо того, чтобы печатать их в обратном порядке. Что касается второго варианта, то я еще не изучил, как будет работать сдвиг битов, и предпочтительно не хотел бы использовать его, пока не изучу его. Спасибо!!

Рейтинг:
2

CPallini

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
  string hex;
  unsigned long l;
  cin >> l;

  if ( l == 0 )
    hex = "0";
  else
  {
    while (l)
    {
      unsigned char c = l & 0x0F;
      hex += static_cast<char>( c < 10 ? c + '0' : c - 10 + 'A' );
      l >>= 4;
    }
    reverse( hex.begin(), hex.end());
  }
  cout << hex << endl;
}


Рейтинг:
1

Ron Anders

Предполагая, что вы хотите распечатать шестнадцатеричную строку десятичного числа, я по умолчанию использую sprintf() для заполнения массива символов шестнадцатеричным числом с помощью спецификатора %x.

Это старый способ и, вероятно, не то, что вы, начальники, хотите от вас, но это даст вам то, что вы хотите - я думаю.


Рейтинг:
0

Member 11260002

/*  decimal /hexa
     Jose Anilto
 */
 #include <iostream>
 #include <cstring>


 using namespace std;


 string converte(int n, string x) {

     string hexa = {"0123456789ABCDEF"};
     return (n < 16 ? "0x" + (hexa[n] + x) : converte(n/16, hexa[n%16] + x));

 }

 int main () {

     int nd ;
     string y = "";
     cout << "\n Digite um numero: "; cin >> nd;
     cout << "\n Numero digitado: " << nd << "\n";

     cout << "\n Hexadecimal: " << converte(nd, y) << "\n";

  return 0;
 }


CHill60

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