Как целое число в двоичном формате преобразуется в строку, содержащую его десятичный аналог? - PullRequest
0 голосов
/ 18 июня 2020

Я пытался написать 128-битный целочисленный класс на C ++ с числом, хранящимся в двоичном формате через два int64_t. Когда я пытался написать функцию, которая преобразует мой номер в std::string (чтобы я мог показать его где-нибудь, например, в cout), я застрял, и это подняло более широкий вопрос, на который я не мог найти ответа.

Рассмотрим число 16, в памяти это число заложено следующим образом: 00010000, если я не ошибаюсь, любое вхождение 16 в десятичной форме (в коде, как выходные значения, значения отладчика, et c.) на самом деле является строкой, содержащей два символа значений 49 (ASCII code for '1') and 54 (ASCII code for '6')

Так как же происходит преобразование из 00010000 (value in memory) в "16" (string)?

Я понимаю, что этот вопрос звучит немного тривиально, но в моем случае я не могу разместить нужные числа в любом существующем контейнере, это было бы немного похоже на 32-битное целое число в двоичном формате, но без типа int, как вы бы напечатали внутри него число?

1 Ответ

0 голосов
/ 18 июня 2020

Для преобразования неотрицательных чисел работает следующий код:

#include <string>
#include <stdexcept>

std::string uint_to_string(unsigned int value, int base = 10)
{
    if(base > 36 || base < 2)
        throw std::invalid_argument("Base must be between 2 and 36");
    if(value == 0)
        return "0";
    std::string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    std::string result;
    while(value > 0)
    {
        int digit = value % base;
        char c = digits[digit];
        result = c + result;
    }
    return result;
}
...