我必须把43.62这样的十进制数字转换成二进制。所以我首先写了一个基本的程序把43转换成二进制。但是我注意到我的程序打印的二进制数是反过来的,所以它打印的是1 1 0 1 0 1,而不是1 0 1 0 1 1。我该如何解决这个问题?
我代码:#include <iostream>
using namespace std;
int main()
{
int number;
int remainder;
cout << "Enter a integer: ";
cin >> number;
while(number != 0)
{
remainder = number % 2;
cout << remainder << " ";
number /= 2;
}
int pause;
cin >> pause;
return 0;
}
不是将每个数字发送给cout,而是将它们发送给数组。然后以相反的顺序读出数组。或者将它们推到堆栈上,然后将它们从堆栈中弹出。还是…
这是一个基于递归方法的解决方案:
#include <iostream>
using namespace std;
void OutputDigit(int number)
{
if (number>0)
{
OutputDigit(number /= 2);
cout << number % 2 << " ";
}
}
int main()
{
OutputDigit(43);
return 0;
}
您可以通过简单地将cout
向上移动一行来获得与之前相同的输出!
看看vector
,想想保存剩余的而不是马上打印它们是如何有用的。
注意,你不必把东西放在向量的末尾。vector::insert
让你指定一个位置…这有帮助吗?
或者,您创建的算法从最低有效数字开始。有没有一种方法可以从最高位开始呢?如果我有数字42 (0101010
),最高有效数字代表32,它前面的0代表64。42减去32会怎样?
存储结果然后向后打印会更容易。使用递归也是实现这一目标的另一种可能。
最高有效位优先:
const unsigned int BITS_PER_INT = CHAR_BIT * sizeof(int);
char bit_char = '0';
for (int i = BITS_PER_INT - 1;
i > 0;
--i)
{
bit_char = (value & (1 << i)) ? '1' : '0';
cout << bit_char << ' ';
}
cout << 'n';
cout.flush();
首先打印最低有效位,改变for
循环的方向。
在c++中,您也可以使用bitset容器来完成此操作,
#include <bitset>
int i = 43;
std::bitset<sizeof(int)*CHAR_BIT> bin(i);
使用字符串函数
string s ;
while(number != 0)
{
remainder = number % 2;
string c = remainder ? "1": "0";
s.insert(s.begin(),c.begin(),c.end());
number /= 2;
}
当您通过保留余数来进行这种转换时,结果将始终被还原。建议使用bitwise &
:
unsigned char bit = 0x80; // start from most significant bit
int number = 43;
while(bit)
{
if( bit & number ) // check if bit is on or off in your number
{
cout << "1";
}
else
{
cout << "0";
}
bit = bit >>1; // move to next bit
}
这个例子将开始检查所有的8位数字,检查位是打开还是关闭,并相应地打印。
最佳选择-使用c++ stringstream格式化I/O
// Add the following headers
#include <sstream>
#include <algorithm>
// your function
stringstream ss;
// Use ss in your code instead of cout
string myString = ss.str();
std::reverse(myString.begin(),myString.end());
cout << myString;