将 'long' 类型转换为二进制字符串

Converting a 'long' type into a binary String

我的objective是写一个算法,能够将一个长数字转换成存储在字符串中的二进制数字。

这是我当前的代码块:

#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

谁能找出问题所在?无论出于何种原因,该函数输出由 32 位表示的 10 与由 32 位表示的另一个 10 连接。

为什么你会假设 long 是 64 位的? 尝试 const size_t LONG_SIZE=sizeof(long)*8;

检查一下,程序可以正确地处理我的更改 http://ideone.com/y3OeB3

编辑:广告@Mats Petersson 指出您可以通过更改此行使其更加健壮

if( (x & ( 1 << i) ) == ( 1 << i) )

类似于

if( (x & ( 1UL << i) ) ) 那个 UL 很重要,你可以在评论中看到他的解释

几点建议:

  1. 确保使用保证为 64 位的类型,例如 uint64_tint64_tlong long
  2. 为您的变量 i 使用上述 64 位类型以保证 1 << i 计算正确。这是因为当移位的位数小于或等于被移位类型中的位数时,移位仅由标准保证 - 并且 1 是类型 int,对于大多数现代平台(显然包括你的平台)来说,它是 32 位。
  3. 不要在 #define LONG_SIZE 的末尾放置分号 - 或者更好的是,使用 const int long_size = 64; 因为这允许所有更好的行为方式,例如你在调试器中可以 print long_size 并得到 64,其中 print LONG_SIZE 其中 LONG_SIZE 是一个宏,将在调试器中产生错误。