2014-02-09 70 views
2

我正在嘗試將矩陣棋盤轉換爲無符號長long。如果在該位置有一枚硬幣,我會更新相應的面具。我的繼承人代碼將棋盤轉換爲位掩模

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 

這顯然是錯誤的。但我在這裏似乎沒有發現任何錯誤。提前致謝。

回答

7

您需要的位操作代碼使用unsigned long long文字:

  mask|=(1ull<<pos); 
        ^^^ 

 if(mask&(1ull<<pos)) 
        ^^^ 

如果編譯器不支持ull後綴,您可能需要顯式轉換1unsigned long long

P.S.如果您想知道當前的代碼如何最終生成它的輸出,請注意輸出由板的兩部分組合在一起並打印兩次。

1

答案是雙重的:

  • 你不應該使用unsigned long long,開始。
  • 常量默認爲int,你需要顯式轉換它們(或使用類型化並命名的)

關於unsigned long long:也不能保證它的寬度就足夠了,它很可能是在舊的只有32位平臺/編譯器。因此,您應該:#include <cstdint>然後使用uint64_t

關於常量,您可以使用uint64_t(1)或者只需定義static uint64_t const Bit = 1;,然後在公式中使用Bit而不是1