我正在尝试打印长整数的位表示。我正在使用这个变量作为我的国际象棋程序的位板。但是,表示未正确打印。我使用以下代码。
void displayBoard()
{
bitset<64>x(fullBoard);
cout<<x<<fullBoard<<endl;
for(int i=0;i<64;i++)
{
if(fullBoard & (1<<i))
{
cout<<"1";
}
else
{
cout<<"0";
}
}
}
前两行使用bitset
类将其转换为二进制表示并打印出来。
但是,当我尝试使用for循环中的代码执行相同操作时,它给出了以下输出:
1111111111111111000000000000000111111111111111110000000000000001
正确的输出是:
1111111111111111000000000000000000000000000000001111111111111111
我使用的fullBoard
的价值是:0xFFFF00000000FFFF
我正在使用以下命令使用C ++ 11进行编译:{{1}}
为什么此代码输出错误?我不认为for循环中有任何错误。
答案 0 :(得分:5)
我认为问题在于:
if(fullBoard & (1<<i))
这应该是:
if(fullBoard & (1ULL<<i))
原因是1<<i
被评估为int,在你的情况下大概是32位,所以它{U}一旦i
超过31。使它成为1ULL<<i
强制将表达式计算为64位。
答案 1 :(得分:1)
乍一看你的循环看起来很好,但是常量1不是64位整数,所以你必须转换为无符号长整数。
答案 2 :(得分:0)
&#34;为什么此代码输出错误?我不认为for循环中有任何错误。&#34;
好吧,正如其他人提到的那样,你的for循环,你的移位操作肯定会出错。但好消息是,你不需要这个for()
循环,你已经掌握了已有的东西。
&#34;正确的输出是:&#34;
1111111111111111000000000000000000000000000000001111111111111111
以下代码
unsigned long long fullBoard = 0xFFFF00000000FFFF;
std::bitset<64> x(fullBoard);
std::cout << x << std::endl;
适用于我,输出符合要求(请参阅 live sample ):
1111111111111111000000000000000000000000000000001111111111111111
尽管如上所示和其他答案已经考虑过,但您的未披露数据类型fullBoard
可能会出现问题。
我的代码示例将其声明为unsigned long long
,较小的类型会将0xFFFF00000000FFFF
切换为0x000000000000FFFF
。请注意这一点,以便始终获得fullBoard
和x
的输出。