Почему неисправно работает перевод из двоичной в десятичную?
#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 шт):
Вам все эти танцы с бубном не нужны. Не уверен во всяких 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.
А дальше просто выводите, как хотите, и что хотите, то и делайте.