【发布时间】:2015-06-21 08:32:22
【问题描述】:
我的目标是编写一种算法,能够将长数转换为存储在字符串中的二进制数。
这是我当前的代码块:
#include <iostream>
#define LONG_SIZE 64; // size of a long type is 64 bits
using namespace std;
string b10_to_b2(long x)
{
string binNum;
if(x < 0) // determine if the number is negative, a number in two's complement will be neg if its' first bit is zero.
{
binNum = "1";
}
else
{
binNum = "0";
}
int i = LONG_SIZE - 1;
while(i > 0)
{
i --;
if( (x & ( 1 << i) ) == ( 1 << i) )
{
binNum = binNum + "1";
}
else
{
binNum = binNum + "0";
}
}
return binNum;
}
int main()
{
cout << b10_to_b2(10) << endl;
}
这个程序的输出是:
00000000000000000000000000000101000000000000000000000000000001010
我希望输出是:
00000000000000000000000000000000000000000000000000000000000001010
谁能找出问题所在?无论出于何种原因,该函数都会输出 10 个由 32 位表示的连接与另外 10 个由 32 位表示的连接。
【问题讨论】:
-
为什么不直接使用
std::bitset::to_string()而不是自己滚动呢?否则,首先使用调试器来查找您的错误。另请注意,保证大小为 64 位,您需要unsigned long long类型。 -
尽管声明 long 为 64 位长,但您似乎希望在输出中获得 32 位数字。可以改用
sizeof吗? -
也许您的实现正在截断模 32 位的移位,所以当您移位 33 位时,它实际上最终会移位 1 位?尝试改用
i作为long吗? -
这不会像你预期的那样编译,因为你的宏后面有一个分号。需要更多证明为什么宏是邪恶的吗?也就是说,
sizeof x * CHAR_BITS应该给你x中的位数。 -
IIRC,移位超过位宽甚至会导致未定义的行为,@MatsPetersson。常见的实现要么将结果归零,要么以位宽为模旋转。我不确定要改变实际的位宽。
标签: c++ string binary data-conversion