将整数更改为二进制数字字符串
Changing integer to binary string of digits
我目前正在为一个comp架构类在c++中模拟MIPS处理器,并且在将十进制数转换为二进制(两种方式都有符号数)时遇到一些问题。直到最后一点,一切都很好,因为我目前的算法落在了int (1<<=31)的边界区域。只需要在正确的方向上轻轻一推,就能让它启动并运行。谢谢!
//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();
Replace:
if((mask&a) >= 1)
与:if ((mask & a) != 0)
或:
if (mask & a)
你的问题是最后一位给了你一个负数,而不是正数。
我检查了你的代码,没有发现任何错误。这是我使用的代码…
#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上运行
1<<=31的问题已经在其他评论中解决了。关于string -> int转换的代码段,您有几个选项:
- 将字符串转换为流并使用为流定义的操作符>>(int&)//更正-别管>:-)setbase()流修饰符不支持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); }
注意,与你的代码相比,这段代码处理负数的方式是不同的:在你的函数中,最高位是sgn。如果函数的字符串参数中最左边的位不在32位(从右开始计数),则函数可能会产生不正确的结果。在这里建议的代码中没有特殊的符号处理。但是如果你得到32位数字的字符串,其中最左边是'1',则int结果中的MSB将为== 1,整数将为负(应该是这样)
为什么不能将int
转换为uint
呢?这样就很容易生成二进制字符串了因为你不用担心符号位。将二进制字符串转换为int
也是如此:将其构建为uint
,然后将其强制转换为int
:
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;
- 生成随机长度的数字字符串
- 如何在c ++中将大数字字符串转换为整数?
- 将非数字字符串存储为二进制整数
- Flex 词法分析器规则,对包含连字符和斜杠的字母数字字符串具有积极的前瞻断言
- 如何在C 中分析二进制数字
- 编写二进制数字时出乎意料的结果[C ]
- 如何在C++中将数字字符串拆分为数组
- C/C++ 方法中最快/最短计算二进制数字总和/又名二进制中的 1 数
- 总结数字字符串输入的最佳方法
- 如何将输入的数字字符串转换为 int 数组
- 分开二进制数字的数字
- 如何使用C 将二进制数字的字符串转换为其签名的十进制表示
- 如何获得两个数字字符串的总和-C
- 如何在没有循环的二进制数字表示中只计算1位
- C++:二进制标准::字符串到十进制
- 在二进制数字中找到第一个位
- 在C 中添加二进制数字
- 使用 C++ 替换 txt 文件中的文本数字字符串
- 有没有一种方法可以将表示为字符串的数字转换为等效的二进制数字
- 将整数更改为二进制数字字符串