【问题标题】:Reversing Decimal to Binary Conversion Result [closed]将十进制转换为二进制结果[关闭]
【发布时间】:2021-05-09 01:45:07
【问题描述】:

我正在尝试使用模运算符将整数转换为二进制。我得到了正确的数字,尽管它们的顺序不正确。例如 76 到二进制是 1001100 但输出是 0011001;因此,如果结果是0,我试图通过输出1 来纠正这个问题,如果结果是1,则输出0,使用if-else 语句;但是结果是1100110,这也是错误的。

这是我的代码:

include <iostream>
using namespace std;

int main() {

    int num;
    int remainder;

    cout << "Enter a decimal number:" << endl;
    cin >> num;
    
    while (num != 0){
        remainder = num % 2;
        if (remainder == 1 ){
            cout << remainder - 1;
        }
        else if (remainder == 0){
            cout << remainder + 1;
        }
        num = num / 2;
    }
    return 0;
}

有什么建议吗?

【问题讨论】:

  • "我正在尝试将整数转换为二进制" 为什么?整数已经二进制。您正在尝试将您的整数转换为二进制在另一个整数中的样子的十进制等价物......这里的最终目标是什么?为什么需要它而不是按原样使用 int 或将其粘贴在二进制字符串中?
  • @scohe001 我认为很明显 OP 想要 print 二进制值。
  • 您需要颠倒数字的打印顺序,而不是交换 0 和 1。
  • 如果你有101010000并且想要反转它,那就是000010101翻转位是010100000,那不一样
  • 把你的数字放在一个容器里!那么你有很多选项,这里有很多答案。

标签: c++ binary integer


【解决方案1】:

您需要颠倒它们的顺序,而不是翻转单个输出数字。有很多方法可以做到这一点,但一种非常“自然”的方法是使用stack——它本质上是一种后进先出 (LIFO) 系统。

C++ Standard Template Library 提供了一个 std::stack 容器,即用型。这是一个可以执行您想要的工作的程序:

#include <iostream>
#include <stack>
using std::cout, std::cin, std::endl; // Pre-C++17, these will need to be separate "using" lines!
using std::stack;

int main()
{
    int num;
    int remainder;
    stack<char> digits;

    cout << "Enter a decimal number:" << endl;
    cin >> num;

    while (num != 0) { // Push the digits onto the stack ...
        remainder = num % 2;
        digits.push(remainder ? '1' : '0');
        num = num / 2;
    }
    while (!digits.empty()) { // ... then print and pop them (in reverse order)
        cout << digits.top();
        digits.pop();
    }
    cout << endl;
    return 0;
}

【讨论】:

  • 但是为什么翻转输出不起作用呢?我仍在努力解决这个问题
  • @Yusuf 翻转输出数字并不能纠正它们顺序错误的事实(即它们被颠倒了)。所以,如果你的真实答案应该是1001100,但你得到的是0011001,那么翻转如何纠正反转?这两个“错误”不会相互抵消。 “错误顺序”问题是您的方法固有的:您正在分析 num 值“自下而上”(即从 最低有效二进制数字开始并向上工作);但是西式数字(从左到右的脚本)打印最重要的位。
【解决方案2】:

您可以使用std::bitset。但是,如果您想在不使用std::bitset 的情况下执行此操作,则可以将位推送到字符串并反转它。

https://en.cppreference.com/w/cpp/utility/bitset

https://en.cppreference.com/w/cpp/utility/bitset/to_string

没有 Bitset 的解决方案

#include <iostream>
#include <string>
#include <algorithm>

int main() {
  int N, i = 0; 
  
  std::cout << "Enter a decimal number:" << std::endl;
  std::cin >> N;

  std::string res(32, '0');
  while (N) {
    res[i++] += (N&1);
    N >>= 1;  
  }

  std::reverse(res.begin(), res.end());
  std::cout << res << std::endl;
}

Bitset 解决方案

#include <iostream>
#include <bitset>

int main() {
  int N; 
  
  std::cout << "Enter a decimal number:" << std::endl;
  std::cin >> N;

  std::cout << std::bitset<32>(N).to_string() << std::endl;
}

【讨论】:

  • 为什么不初始化i = 31,然后在循环中做res[i--] += (N &amp; 1);?那么你就不需要打电话给std:reverse了。
  • @AdrianMole 如果你愿意,你可以这样做:)
猜你喜欢
  • 2021-02-16
  • 2021-01-29
  • 2021-01-31
  • 1970-01-01
  • 2013-11-07
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
相关资源
最近更新 更多