2

我必须将像 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;
}
4

9 回答 9

3

不是将每个数字发送到 cout,而是将它们发送到数组。然后以相反的顺序读出数组。或者将它们压入堆栈,然后将它们从堆栈中弹出。或者...

于 2011-10-20T15:53:27.863 回答
3

破解坚果的大锤,但这里有一个基于递归方法的解决方案:

#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只需将一行向上移动即可获得与以前相同的输出!

于 2011-10-20T16:00:54.110 回答
1

看看vector并思考保存剩余部分而不是立即打印它们有什么用处。

请注意,您不必将内容放在向量的末尾。 vector::insert让你指定一个位置......这有帮助吗?

或者,您创建的算法从最低有效位开始。有没有办法从最重要的数字开始?如果我有数字 42 ( 0101010),最重要的数字代表 32s,它前面的 0 代表 64s。如果我从 42 中减去 32 会发生什么?

于 2011-10-20T16:00:44.703 回答
0

存储结果然后向后打印会更容易。使用递归也是这样做的另一种可能性。

于 2011-10-20T15:53:48.853 回答
0

只需使用字符串函数

string s ;

while(number != 0)
{
    remainder = number % 2;
    string c = remainder ? "1": "0";
    s.insert(s.begin(),c.begin(),c.end());
    number /= 2;
}
于 2011-10-20T16:06:13.133 回答
0

当您通过保留余数进行此类转换时,结果将始终被还原。建议使用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 位,并检查该位是打开还是关闭并相应地打印出来。

于 2011-10-20T16:07:14.443 回答
0

最重要的位在前:

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循环的方向。

于 2011-10-20T16:01:54.053 回答
0

在 C++ 中,您还可以使用 bitset 容器来执行此操作,

#include <bitset>

int i = 43;
std::bitset<sizeof(int)*CHAR_BIT> bin(i);
于 2011-10-20T16:02:08.950 回答
0

最佳选择 - 使用 C++ 字符串流格式化 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;
于 2017-08-16T12:25:12.290 回答