C++ 长序列的二进制表示
所以我一直在做一些关于位字符串的工作,在我的旅行中,我需要以二进制形式显示这个长字符串。变量具有正确的值,如第一栏所示。但是,当它以二进制显示时,会丢失一个“1”。你知道这是什么原因吗C++ 长序列的二进制表示,c++,bit-manipulation,iostream,C++,Bit Manipulation,Iostream,所以我一直在做一些关于位字符串的工作,在我的旅行中,我需要以二进制形式显示这个长字符串。变量具有正确的值,如第一栏所示。但是,当它以二进制显示时,会丢失一个“1”。你知道这是什么原因吗 #include <iostream> #include <bitset> using namespace std; int main(){ long long truncator=4294967551ll; cout<<truncator<<"
#include <iostream>
#include <bitset>
using namespace std;
int main(){
long long truncator=4294967551ll;
cout<<truncator<<"\n";
std::bitset<64> b(truncator);
cout<<b;
return 0;
}
#包括
#包括
使用名称空间std;
int main(){
长截断器=4294967551ll;
cout根据,您尝试使用的std::bitset
构造函数只使用了无符号长
,在您的系统上,它可能只有32位。其他系统的无符号长
为64位,因此其他系统可能看不到这个问题(请尝试打印sizeof(unsigned long)
)
唯一真正的解决方法是从截断器的低位32位构造位集,并手动设置其余的位。编写自己的函数将long
转换为字符串:
string convertToBitString(long long value)
{
string str(64, '0');
for(int i = 0; i < 64; i++)
{
if( (1ll << i) & value)
str[63-i] = '1';
}
return str;
}
string convertToBitString(长值)
{
字符串str(64,'0');
对于(int i=0;i<64;i++)
{
if((1ll位集处理64位参数的方式因编译器而异。某些Visual Studio版本接受long-long,而其他编译器仅接受32位long,即使它们有64位long-long可用。但打印二进制表示形式应该不难。简单,我不知道,未经测试
string str;
do
{
str += ((truncator&1)?'1':'0');
} while (--truncator);
reverse(str.begin(), str.end());
您能提供您在问题中看到的输出吗?string s=b.to_string();根据请求添加的输出是否正确也适用于Visual Studio Ultimate 2012…您使用的编译器是什么?可能尝试使用b.to_string()
?在windows中,long是32位长的,在类似unix的系统中long是指针大小,两个构造函数的long都是64位长的,根据它是一个无符号的long long或string,这可能是在C++0x中修复的-此外,我看到的行为暗示,他最终调用的构造函数只接受32位尼尔·柯克解决了这个问题。