繁体   English   中英

将整数更改为二进制数字字符串

[英]Changing integer to binary string of digits

我目前正在使用C ++模拟MIPS处理器,用于comp体系结构类,并且在从十进制数转换为二进制数(双向带符号数)方面存在一些问题。 一切正常,直到最后一点,因为我的当前算法在1 << = 31时落入int的界限区域。 只需要朝着正确的方向轻推即可启动并运行。 谢谢!

//Assume 32 bit decimal number
string DecimalToBinaryString(int a)
{
    string binary = "";
    int mask = 1;
    for(int i = 0; i < 31; i++)
    {
        if((mask&a) >= 1)
            binary = "1"+binary;
        else
            binary = "0"+binary;
        mask<<=1;
    }
    cout<<binary<<endl;
    return binary;
}

我还包括我的其他算法的完整性。 我为缺乏评论而道歉,但这是相当直接的。

int BinaryStringToDecimal(string a)
{
    int num = 0;
    bool neg = false;
    if(a.at(0) == '1')
    {
        neg = true;
        for(int x = a.length()-1; x >= 0; x--)
        {
            if(a.at(x) == '1')
                a.at(x) = '0';
            else a.at(x) = '1';
        }
        a.at(a.length()-1) += 1;
        for(int x = a.length()-1; x >= 0; x--)
        {
            if(a.at(x) == '2')
            {
                if(x-1 >= 0)
                {
                    if(a.at(x-1) == '1')
                        a.at(x-1) = '2';
                    if(a.at(x-1) == '0')
                        a.at(x-1) = '1';
                    a.at(x) = '0';
                }
            }
            else if(a.at(x) == '3')
            {
                if(x-1 >= 0)
                    a.at(x-1) += '2';
                a.at(x) = '1';
            }
        }
        if(a.at(0) == '2')
            a.at(0) = '0';
        else if(a.at(0) == '3')
            a.at(0) = '1';
    }
    for(int x = a.length()-1; x >= 0; x--)
    {
        if(a.at(x) == '1')
            num += pow(2.0, a.length()-x-1);
    }
    if(neg)
        num = num*-1;   
    return num;
 }

此外,如果有人知道任何好的方法来更有效地写这些,我很乐意听到它。 我只有两个入门编程课程,但一直在玩不同的技术,看看我喜欢他们的风格。

实际上有这些标准的单行。

#include <bitset>

std::string s = std::bitset< 64 >( 12345 ).to_string(); // string conversion

std::cout << std::bitset< 64 >( 54321 ) << ' '; // direct output

std::bitset< 64 > input;
std::cin >> input;
unsigned long ul = input.to_ulong();

将此运行视为演示

更换:

if((mask&a) >= 1)

与任何一个:

if ((mask & a) != 0)

要么:

if (mask & a)

你的问题是最后一位给你一个负数,而不是一个正数。

1 << = 31的问题已在其他评论中得到解决。 关于字符串 - > int转换的代码片段,您有几个选项:

  • 将字符串转换为流并使用为流定义的运算符>>(int&)//更正 - 不要介意> :-) setbase()stream modifier不支持2值作为参数
  • 使用标准C函数strtol(),它具有基值参数(2表示二进制)
  • 或者如果您真的想要实现转换,请尝试以下代码:

     int BinaryStringToDecimal(string a) { int Rslt = 0; int Mask = 1; for (int i = a.length()-1; i >= 0; --i, Mask <<= 1) { if (a.at(i) != '0') { Rslt |= Mask; } } return (Rslt); } 

请注意,与代码相比,此代码处理负数的方式不同:在函数中,最高位将被视为符号。 如果函数的字符串参数中最左边的位不在位置32(从右边计数),则函数可能会产生不正确的结果。 在这里建议的代码中没有特殊的符号处理。 但是如果你得到32位数字的字符串,其中最左边的'1',那么int结果中的MSB将是== 1,整数将是负数(因为它应该是)

为什么你不能把int转换为uint 然后生成二进制字符串非常容易,因为您不必担心符号位。 将二进制字符串转换为int :将其构建为uint ,然后将其uintint

string DecimalToBinaryString(int a)
{
    uint b = (uint)a;
    string binary = "";
    uint mask = 0x80000000u;
    while (mask > 0)
    {
        binary += ((b & mask) == 0) ? '0' : '1';
        mask >>= 1;
    }
    cout<<binary<<endl;
    return binary;
}

当然,您可以应用上面提到的优化,例如预分配字符串缓冲区等。

走另一条路:

uint b = 0;
for (int i = 31; i >=0; --i)
{
    b <<= 1;
    if (a.at(i) == '1')
        b |= 1;
}
int num = (int)b;

我检查了你的代码,但没有发现任何错误。 这是我用过的代码......

#include <iostream>
#include <string>
using namespace std;

int main ()
{
  int a=1111165117;
  string binary  ("");
    int mask = 1;
    for(int i = 0; i < 31; i++)
    {
    if((mask&a) >= 1)
        binary = "1"+binary;
    else
        binary = "0"+binary;
     mask<<=1;
 }
 cout<<binary<<endl;
 system("PAUSE");         //optional if not using ideone
 return EXIT_SUCCESS;     //optional if not using ideone
 }

输出将是1001110001010110101111010011101。我可以在ideone上运行它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM