11

ビットボードを処理しようとしています。これには、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 の問題は何ですか?また、どうすれば回避できますか?

4

3 に答える 3

21

1LLシフトoperator <<を使用して 64 ビットの結果を取得する前に、64 ビット値として使用する必要があります。

#include <stdint.h>
uint64_t kings = 0ULL; 
kings |= 1ULL << i;
于 2015-06-11T09:59:09.157 に答える
3

64 ビット整数をビットシフトする必要があります。

kings |= 1i64 << 59;
于 2015-06-11T09:59:19.720 に答える