长整型的位表示未正确打印

Bit representation not being printed correctly for long int

本文关键字:打印 表示 长整型      更新时间:2023-10-16

我正在尝试打印一个长整数的位表示。我正在使用这个变量作为我的国际象棋程序的比特板。但是,表示打印不正确。我正在使用以下代码。

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进行编译:g++ board.cpp -std=c++11

为什么这个代码给出了错误的输出?我认为for循环中没有任何错误。

我认为问题出在这里:

    if(fullBoard & (1<<i))

这应该是:

    if(fullBoard & (1ULL<<i))

原因是1<<i被计算为int,在您的情况下可能是32位,所以一旦i超过31,它就是UB。使其为1ULL<<i将强制表达式求值为64位。

好吧,您的循环乍一看很好,但常量1不是64位整数,因此您必须将转换为无符号长整型。

"为什么这个代码给出了错误的输出?我认为for循环中没有任何错误。"

好吧,正如其他人提到的,在for循环和shift操作中肯定存在错误。但好消息是,你不需要这个for()循环,因为你手头已经有了。

"正确的输出是:"

1111111111111111000000000000000000000000000000001111111111111111

以下代码

unsigned long long fullBoard = 0xFFFF00000000FFFF;
std::bitset<64> x(fullBoard);
std::cout << x << std::endl;

对我来说效果很好,输出如所需(请参阅实时样本):

1111111111111111000000000000000000000000000000001111111111111111

尽管如此,考虑到上面显示的内容和其他答案,您可能对未披露的数据类型fullBoard有问题
我的代码示例将其声明为unsigned long long,较小的类型将截断0xFFFF00000000FFFF0x000000000000FFFF。请注意这一点,以一致地获得fullBoardx的输出。