我正在尝试将矩阵棋盘转换为无符号长整数。如果该位置有硬币我更新相应的掩码。继承我的代码
unsigned long long int mask = 0;
cout<<mask<<endl;
for(int i=0;i<8;++i)
for(int j=0;j<8;++j){
int pos = i*8+j;
cin>>board[i][j];
if(board[i][j] == 'P')
mask|=(1<<pos);
}
for(int i=0;i<8;++i)
{
for(int j=0;j<8;++j)
{
int pos = i*8+j;
if(mask&(1<<pos))
cout<<1;
else
cout<<0;
}
cout<<endl;
}
但是当我提供以下输入时
........
...P....
.....P..
...P....
........
........
P......P
.......P
输出如下
00000000
00010000
10000101
00010001
00000000
00010000
10000101
00010001
这显然是错误的。但我似乎没有在这里发现任何错误。提前谢谢。
答案 0 :(得分:7)
您需要在位操作代码中使用unsigned long long
文字:
mask|=(1ull<<pos);
^^^
和
if(mask&(1ull<<pos))
^^^
如果您的编译器不支持ull
后缀,则可能必须明确地将1
强制转换为unsigned long long
。
P.S。如果您想知道当前代码如何最终产生输出,请观察输出由电路板的两半组成,或者打印两次。
答案 1 :(得分:1)
答案是双重的:
unsigned long long
开头。int
,您需要显式转换它们(或使用输入和命名的)关于unsigned long long
:无法保证其宽度足够,在旧平台/编译器上可能只有32位。因此,您应该:#include <cstdint>
然后使用uint64_t
。
关于常量,您可以使用uint64_t(1)
,也可以只定义static uint64_t const Bit = 1;
,然后在公式中使用Bit
代替1
。