ビットボードを処理しようとしています。これには、64 ビットの符号なし整数で特定のビットを設定する必要があります。ビットiを設定するには、左にシフトされた数値を使用して、問題のビットボードでビットごとの OR を実行します。
#include <stdint.h>
uint64_t kings = 0ULL; // Also tried unsigned long long int before.
kings |= 1 << i;
ビット 0 からビット 31 までは問題なく動作しますが、ビット 32 から 63 までは動作しません。右辺の評価がたまたま 32 ビット整数になっているためだと思われます。したがって、一時変数を試しました。
uint64_t temp = 0ULL;
temp |= 1 << i;
おそらく、右辺がまだ 32 ビット整数として評価されているか、それとも私が理解できない他の問題であると考えられます。整数を出力するには、std::bitset<64> を使用しています。例えば:
uint64_t kings = 0ULL;
kings |= 1 << 3;
kings |= 1 << 59;
予想される 10 進値: 576460752303423496
実際: 8
std::bitset<64> x(kings);
std::cout << x;
ビット値:000000000000000000000000000000000000000000000000000000001000
明らかに、キングのみ |= 1 << 3; 正しく動作しました。
要約すると、ビット 32 から 63 の問題は何ですか?また、どうすれば回避できますか?