手続き型生成のダンジョンを作成するゲームに取り組んでいるときに、ビットマスキングを使用して部屋番号やドアのタイプなどを取得する例を見つけました。
この例では、彼はビットマスクを使用して、各タイルの整数から詳細を取得します。整数はこのように分解されます
0xLLSDRRET
L - is the Level Number
S - Denotes a special tile(Like Stairs)
D - is if its a door, and what type(Door, Arch, Trapped)
R - Room number
E - Flags an entrance to a room
T - Names the type of tile(Floor, Cooridor, Blocked)
この場合、彼はビットマスクを使用して、たとえば次のような部屋番号を取得します。
int[][] map = new int[40][40]
int $ROOM_ID = 0x0000FF00;
System.out.println(map[x][y] & $ROOM_ID);
これで、map [x] [y]がたとえば0x00001200の場合、出力は1200になります。私が理解しているマスクのこの部分。
しかし、ソースでは$ ROOM_IDは実際には0x0000FFC0であり、Cが何をするのか理解できません。たとえば、さまざまな値を試したため、Cが何をするのかを把握できないようです。
0x00001200 output-> 1200
0x00001210 output-> 1200
0x00001220 output-> 1200
0x00001230 output-> 1200
0x00001240 output-> 1240
0x00001250 output-> 1240
0x00001260 output-> 1240
0x00001270 output-> 1240
0x00001280 output-> 1280
0x00001290 output-> 1280
0x000012A0 output-> 1280
0x000012B0 output-> 1280
0x000012C0 output-> 12C0
0x000012D0 output-> 12C0
0x000012E0 output-> 12C0
0x000012F0 output-> 12C0
ビットマスクの知識が豊富な人が、0x0000FFC0&0x000012F0 = 12C0の理由を説明できますか?