我目前正在阅读一本关于C ++的书,有一项任务要求读者将二进制数(由用户输入)转换为十进制等值。到目前为止,我有以下代码,但它只是输出0.任何想法出了什么问题?
#include <iostream>
using namespace std;
int main()
{
int x, b = 10, decimalValue = 0, d, e, f, count = 1, counter = 0;
cout << "Enter a binary number: ";
cin >> x;
x /= 10;
while( x > 0)
{
count++;
x = x/10;
}
while (counter < count)
{
if (x == 1)
{
f = 1;
}
else{
f = x % b;
}
if (f != 0)
{
if (counter == 0)
{
decimalValue = 1;
}
else
{
e = 1;
d = 1;
while (d <= counter)
{
e *= 2;
d++;
}
decimalValue += e;
}
}
x /= b;
counter++;
}
cout << decimalValue << endl;
system("pause");
return 0;
}
答案 0 :(得分:2)
因为while( x > 0)
循环仅在x <= 0
时停止。此外,cin >> x
允许用户输入十进制号。
答案 1 :(得分:2)
在那段代码之后:
while( x > 0)
{
count++;
x = x/10;
}
x始终为0,因此将x
放入用于计算count
的临时变量中:
int tmp = x;
while(tmp > 0)
{
count++;
tmp = tmp /10;
}
答案 2 :(得分:2)
我写了一些示例代码。阅读并看看你是否能理解我所做的一切。询问有关令人困惑的任何问题的问题。
#include <iostream>
#include <string>
#include <cassert>
#include <stdexcept>
#include <limits>
unsigned DecodeBinary(const std::string &sBin)
{
// check for a bad string
if (sBin.npos != sBin.find_first_not_of("01"))
throw std::invalid_argument("Badly formed input string");
// check for overflow
if (sBin.length() > std::numeric_limits<unsigned>::digits)
{
throw std::out_of_range("The binary number is too big to "
"convert to an unsigned int");
}
// For each binary digit, starting from the least significant digit,
// set the appropriate bit if the digit is not '0'
unsigned nVal = 0;
unsigned nBit = 0;
std::string::const_reverse_iterator itr;
for (itr=sBin.rbegin(); itr!=sBin.rend(); ++itr)
{
if (*itr == '1')
nVal |= (1<<nBit);
++nBit;
}
return nVal;
}
int main()
{
try
{
std::cout << "Enter a binary number: ";
std::string sBin;
std::cin >> sBin;
unsigned nVal = DecodeBinary(sBin);
std::cout << "\n" << sBin << " converts to " << nVal << "\n";
return 0;
}
catch (std::exception &e)
{
std::cerr << "\n\nException: " << e.what() << "\n";
return 1;
}
}
考虑输入“1101”
从最低有效数字开始,索引0
指数3 2 1 0
值1 1 0 1为“1”,输出的第0位设为1(00000001 = 1)。
下一个数字是零,所以什么都不做 下一个数字是'1',因此将第2位设置为1(00000101 = 5)
下一个数字是'1',因此将第3位设置为1(00001101 = 13)
答案 3 :(得分:0)
我知道实现这一目标的最简单方法如下:
int binaryToInteger(string binary) {
int decimal = 0;
for (char x : binary) {
decimal = (decimal << 1) + x - '0';
}
return decimal;
}
例如,“101”将按如下方式转换:
1)十进制=(0 <&lt; 1)+ 1 = 1
2)十进制=(1 <&lt; 1)+ 0 = 2
3)十进制=(2 <&lt; 1)+ 1 = 5