2014-02-09 3 views
2

Я пытаюсь превратить матричную шахматную доску в unsigned long long. Если в этой позиции есть монета, я обновляю соответствующую маску. Heres мой кодПреобразование шахматной доски в битмаску

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, возможно, придется явно привести 1 до unsigned long long.

P.S. Если вам интересно, как ваш текущий код заканчивает работу над производством, обратите внимание, что вывод состоит из двух половин платы ORed вместе и дважды печатается.

1

Ответ двоякий:

  • вы не должны использовать unsigned long long, чтобы начать с.
  • константы по умолчанию int, вам нужно явное приведению их (или использованной на машинку и именованных единицы)

Что касается unsigned long long: нет никакой гарантии, что ее ширина достаточна, она вполне может быть только 32 битом на старом платформы/компиляторы. Поэтому вам необходимо: #include <cstdint>, а затем использовать uint64_t.

Что касается констант, вы можете использовать либо uint64_t(1) на месте, или просто определить static uint64_t const Bit = 1;, а затем использовать Bit вместо 1 в формулах.

Смежные вопросы