长整型的位表示未正确打印
Bit representation not being printed correctly for long int
我正在尝试打印一个长整数的位表示。我正在使用这个变量作为我的国际象棋程序的比特板。但是,表示打印不正确。我正在使用以下代码。
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
,较小的类型将截断0xFFFF00000000FFFF
到0x000000000000FFFF
。请注意这一点,以一致地获得fullBoard
和x
的输出。
- 如何循环打印顶点结构
- 表示"accepting anything for this template argument" C++概念的通配符
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 如何在c++中打印目录
- 如何将ampl中的集合表示为c++中的向量
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在线编译器中的分段C++没有打印消息
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- std::is_base_of表示ctor编译错误
- 如何将结构插入到集合中并打印集合的成员
- 在Python中构建类似于__repr__的对象的可打印表示
- 如何在计算机内存中打印长双重表示的二进制表示
- 有没有一种方法可以打印对象的位表示
- 打印有符号整数的二进制表示形式
- 打印对象的文本表示
- 长整型的位表示未正确打印
- 如何打印出文件的二进制表示形式
- 打印数字的二进制表示形式
- 打印非常长的二进制表示的整数值