没有为long int正确打印位表示

时间:2014-10-10 16:47:09

标签: c++ c++11 binary bitset

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

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循环中有任何错误。

3 个答案:

答案 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。请注意这一点,以便始终获得fullBoardx的输出。