10

このWeb サイトに従って、16 ビット整数の 2 次元配列で迷路を表現したいと考えています。

各 16 ビット整数は、次の情報を保持する必要があります。

これを行う 1 つの方法を次に示します (これが唯一の方法ではありません)。12x16 の迷路グリッドは、16 ビット整数の配列 m[16][12] として表すことができます。各配列要素には、グリッド内の対応する 1 つのセルのすべての情報が含まれ、整数ビットは次のようにマップされます。

代替テキスト
(ソース: mazeworks.com )

壁を壊したり、境界線を設定したり、特定のパスを作成したりするには、1 つまたは 2 つの配列要素のビットを反転するだけです。

16 ビット整数でビットごとのフラグを使用して、これらのビットのそれぞれを設定し、それらが設定されているかどうかを確認するにはどうすればよいですか。

簡単に読める方法 (つまり、Border.W、Border.E、Walls.N など) でそれを行いたいと思います。

これは一般的にC++でどのように行われますか? それぞれを表すために 16 進数を使用する必要がありますか (つまり、Walls.N = 0x02、Walls.E = 0x04 など)? 列挙型を使用する必要がありますか?


単一のビットをどのように設定、クリア、およびトグルしますか?も参照してください。.

4

8 に答える 8

9

ビットフィールドを使用したい場合、これは簡単な方法です:

typedef struct MAZENODE
{
    bool backtrack_north:1;
    bool backtrack_south:1;
    bool backtrack_east:1;
    bool backtrack_west:1;
    bool solution_north:1;
    bool solution_south:1;
    bool solution_east:1;
    bool solution_west:1;
    bool maze_north:1;
    bool maze_south:1;
    bool maze_east:1;
    bool maze_west:1;
    bool walls_north:1;
    bool walls_south:1;
    bool walls_east:1;
    bool walls_west:1;
};

次に、コードでそれぞれの true または false をテストできます。

于 2009-02-13T18:34:19.073 に答える
3

どの特定のビットが何を意味するかを気にする場合は、16進定数/列挙型とビット単位の演算を使用してください。

それ以外の場合は、C ++ビットフィールドを使用します(ただし、整数のビットの順序はコンパイラに依存することに注意してください)。

于 2009-02-13T18:13:43.600 に答える
2

ビットごとの演算子を学習します:&、|、^、および!。

多くのC/C ++ファイルの上部に、各ビットをマスクするために16進数で定義されたフラグが表示されています。

#define ONE 0x0001

ビットがオンになっているかどうかを確認するには、1とANDします。オンにするには、1とORします。スイッチのように切り替えるには、1とXORします。

于 2009-02-13T18:17:09.050 に答える
2

ビットのセットを操作するには、 ... も使用できます。

std::bitset<N>

std::bitset<4*4> bits;
bits[ 10 ] = false;
bits.set(10);
bits.flip();
assert( !bits.test(10) );
于 2009-03-20T12:16:56.587 に答える
1

はい、良い方法は、ビットパターンを表すために16進数を使用することです。次に、ビット演算子を使用して16ビットintを操作します。

例えば:

if(x & 0x01){} // tests if bit 0 is set using bitwise AND
x ^= 0x02;     // toggles bit 1 (0 based) using bitwise XOR
x |= 0x10;     // sets bit 4 (0 based) using bitwise OR
于 2009-02-13T18:15:09.197 に答える
1

あなたが提案したように、16進数のフラグまたは列挙型でそれを行うことができますが、最も読みやすい/自己文書化は、おそらく「ビットフィールド」と呼ばれるものを使用することです(詳細については、Google for C++ bitfields)。

于 2009-02-13T18:10:11.800 に答える
0

私はビットセットの大ファンではありません。私の意見では、それはただもっとタイプしているだけです。そしてそれはとにかくあなたがしていることを隠しません。あなたはまだする必要があります&&&| ビット。あなたがたった1ビットを選んでいない限り。これは、フラグの小さなグループで機能する可能性があります。自分たちがしていることを隠す必要があるというわけではありません。しかし、クラスの目的は通常、ユーザーにとって何かを簡単にすることです。私はこのクラスがそれを達成するとは思わない。

たとえば、..64個のフラグを持つフラグシステムがあるとします。あなたがテストしたいのなら..私は知りません..それらがすべてオンになっているかどうかを確認するための1つのifステートメントでそれらの39...ビットフィールドを使用することは大きな苦痛です。それらをすべて入力する必要があります。もちろん。私はあなたが使用するだけの仮定をしていますビットフィールド機能であり、メソッドを組み合わせて使用​​することはできません。ビットセットでも同じです。クラスで何かが足りない場合を除いて..それはめったに使用しないのでかなり可能です..穴のことを入力するか、「標準メソッド」に頼らない限り、39個のフラグすべてをテストできる方法がわかりません(列挙型フラグリストまたは39ビットの定義値とビットセット&&演算子を使用)。これは、アプローチによっては厄介になり始める可能性があります。そして、私は知っています..64個のフラグはたくさんのように聞こえます。そしてまあ。それは..あなたがしていることに依存します。個人的に言えば、私が関わっているプロジェクトのほとんどは旗システムに依存しています。だから実際には..64は前代未聞ではありません。私の経験では16〜32がはるかに一般的ですが。私は実際に、1つのフラグシステムが640ビットであるプロジェクトを支援しています。基本的には特権システムです。

于 2009-05-19T04:12:08.297 に答える