2009-02-13 46 views
10

根據this網站,我希望用一個16位整數的二維數組表示一個迷宮。如何在C++中使用按位標誌?

每個16位整數需要持有以下信息:

下面是做到這一點的一種方式(這決不是唯一的方式):一個12x16迷宮網格可以被表示爲一個數組M [ 16] [12] 16位整數。每個陣列元素將包含用於在網格中的單個對應的小區的所有信息,與這樣映射的整數位:

alt text http://www.mazeworks.com/mazegen/mazetut/tut5.gif

擊倒一個壁,設置一個邊界,或者創建一個特定路徑,我們所需要做的就是在一個或兩個數組元素中翻轉位。

如何在16位整數上使用按位標誌,以便我可以設置這些位中的每一位並檢查它們是否設置。

我想以易於閱讀的方式(即Border.W,Border.E,Walls.N等)進行此操作。

這是如何通常在C++中完成的?我是否使用十六進制來表示每一個(即Walls.N = 0x02,Walls.E = 0x04等)?我應該使用枚舉嗎?


另請參閱How do you set, clear, and toggle a single bit?

回答

1

你可以按照你的建議使用十六進制標誌或枚舉,但最具可讀性/自我記錄可能使用所謂的「位域」(詳情請參閱Google的C++ bitfields)。

3

如果您關心哪些特定位意味着什麼,請使用十六進制常量/枚舉和按位操作。否則,使用C++位字段(但要注意整數中位的順序將依賴於編譯器)。

1

是的好方法是使用十六進制十進制來表示位模式。然後你使用按位運算符來操縱你的16位整數。

例如:

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 
2

瞭解您的按位opertors:&,|,^和!

在很多C/C++文件的頂部,我看到了用十六進制定義的標誌來屏蔽每一位。

#define ONE 0x0001 

要查看是否有點開啓時,你和它有1.用1

9

打開它,你或將其與1要切換就像一個開關,XOR,如果你想要使用位域,那麼這是一個簡單的方法:

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; 
}; 

然後你的代碼可以測試每一個真或假。

+0

不幸的是,這是不可移植的,因爲位的順序是編譯器特定的。 – 2009-02-13 18:38:22

2

要操縱位集合的,你也可以使用....

std::bitset<N>

std::bitset<4*4> bits; 
bits[ 10 ] = false; 
bits.set(10); 
bits.flip(); 
assert(!bits.test(10)); 
0

我不是bitset的一個巨大的風扇。這只是我認爲的更多打字。無論如何,它並沒有隱藏你在做什麼。您仍然需要& & & |位。除非你只選擇1位。這可能適用於小組標誌。不是我們需要隱藏我們正在做的事情。但是課堂的意圖通常是爲了讓用戶更容易。我不認爲這個班會完成它。

舉個例子,你有一個帶有64個標誌的標誌系統。如果你想測試..我不知道..他們中的39人是否在聲明中看到他們是否全部在使用位域是一個巨大的痛苦。你必須全部輸入。課程。我假設你只使用位域功能,而不是混合和匹配方法。與bitset相同的東西。除非我錯過了課堂上的東西..這是很有可能的,因爲我很少使用它..我沒有看到一種方式,你可以測試所有39個標誌,除非你輸入洞的東西或訴諸「標準方法」(使用枚舉標誌列表或某些39位定義值並使用運算符的位集& &運算符)。根據您的方法,這可能會變得雜亂無章。我知道.. 64個旗幟聽起來很多。好吧。這是..取決於你在做什麼。就個人而言,我參與的大多數項目都依賴於國旗系統。所以實際上...... 64並不是聞所未聞的。雖然16〜32在我的經驗中更爲普遍。我實際上正在幫助一個項目,其中一個標誌系統有640位。這基本上是一個特權系統。所以把它們放在一起是有道理的......但是..誠然..我想打破這一點..但是..呃......我正在幫助..不創造。