将 '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 很重要,你可以在评论中看到他的解释
几点建议:
- 确保使用保证为 64 位的类型,例如
uint64_t
、int64_t
或 long long
。
- 为您的变量
i
使用上述 64 位类型以保证 1 << i
计算正确。这是因为当移位的位数小于或等于被移位类型中的位数时,移位仅由标准保证 - 并且 1
是类型 int
,对于大多数现代平台(显然包括你的平台)来说,它是 32 位。
- 不要在
#define LONG_SIZE
的末尾放置分号 - 或者更好的是,使用 const int long_size = 64;
因为这允许所有更好的行为方式,例如你在调试器中可以 print long_size
并得到 64,其中 print LONG_SIZE
其中 LONG_SIZE 是一个宏,将在调试器中产生错误。
我的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 很重要,你可以在评论中看到他的解释
几点建议:
- 确保使用保证为 64 位的类型,例如
uint64_t
、int64_t
或long long
。 - 为您的变量
i
使用上述 64 位类型以保证1 << i
计算正确。这是因为当移位的位数小于或等于被移位类型中的位数时,移位仅由标准保证 - 并且1
是类型int
,对于大多数现代平台(显然包括你的平台)来说,它是 32 位。 - 不要在
#define LONG_SIZE
的末尾放置分号 - 或者更好的是,使用const int long_size = 64;
因为这允许所有更好的行为方式,例如你在调试器中可以print long_size
并得到 64,其中print LONG_SIZE
其中 LONG_SIZE 是一个宏,将在调试器中产生错误。