Почему неисправно работает перевод из двоичной в десятичную?

#include <iostream>
#include <cmath>

void adding_null(std::string &bin_str)
{
    std::string nulls;
    while(size(bin_str) + size(nulls) != 7)
        nulls += '0';

    nulls += bin_str;
    bin_str = nulls;
}

void from_ten_to_two(int &num)
{
    int ans = 10;
    while (num > 0)
    {
        ans += num % 2;
        ans *= 10;
        num /= 2;
    }
    num = 0;
    while (ans > 0)
    {
        num += (ans % 10);
        num *= 10;
        ans /= 10;
    }
    num /= 100;
}

int main()
{
    long int key_int{0};
    std::string key_str;
    std::string key;
    std::cin >> key;

    for(int i = 0; i < 8; i++)
    {
        int dec = key[i];
        from_ten_to_two(dec);
        std::string bin = std::to_string(dec);
        adding_null(bin);
        key_str += bin;
    }

    std::cout << key_str << '\n';

    for(int j {0}, i{55}; i >= 0; i--, j++)
    {
        key_int += (key_str[j] - '0') * pow(2, i);
    }

    std::cout << '\n' << key_int << '\n';

    return 0;
}

Код должен переводить слово в двоичную, а затем в десятичную системы счисления. В key_str записано двоичное число из 55 символов 0 или 1, перевод должен осуществляться по формуле 101101102 = (1·27)+(0·26)+(1·25)+(1·24)+(0·23)+(1·22)+(1·21)+(0·20) = 128+32+16+4+2 = 18210 и записываться в key_int, но при переводе у некоторых чисел добавляется лишняя единица в конце.


Ответы (1 шт):

Автор решения: Harry

Вам все эти танцы с бубном не нужны. Не уверен во всяких stricted aliasing, но работать вполне будет:

string s;
cin >> s;
if (s.size() != 8)
{
    cerr << "Wrong length\n";
    return 1;
}
unsigned long long x = *reinterpret_cast<const unsigned long long*>(s.c_str());

// Если в обратном порядке:

reverse(s.begin(),s.end());
unsigned long long y = *reinterpret_cast<const unsigned long long*>(s.c_str());

cout << hex << x << "  " << y;

Специально не стал брать bitset, хотя с ним было бы проще.

Какое вам именно число надо — где первый символ старший или младший — выберите сами. Отличие в лишнем reverse.

А дальше просто выводите, как хотите, и что хотите, то и делайте.

https://ideone.com/pF6lDX

→ Ссылка