2010-04-25 27 views
5

在我正在處理的一些代碼中,我應該處理十個獨立參數,它們可以取兩個值(0或1)中的一個。這創造了2^10個不同的條件。有些情況從未發生過,可以省略,但是確實發生的情況仍然很多,並且使得所有情況都是瘋狂的。標誌位計算和檢測

我想使用10 if語句而不是巨大的switch。爲此,我知道我應該使用標誌位,或者標誌字節,因爲語言是javascript,它更容易與10字節的字符串一起使用來表示10位二進制文​​件。

現在,我的問題是,我不知道如何實現這一點。我已經看到這在API s中使用,其中多個可選選項暴露爲數字1,2,4,8,...,n ^(n-1),它們是1,10,100,1000等的十進制等價物二進制。因此,如果我們撥打電話bar = foo(7),酒吧將是一個對象,無論三個最右邊的標誌啓用了什麼選項。

我可以將十進制數轉換爲二進制數,並在每個if語句中檢查是否設置了相應的數字。但我不知道,有沒有辦法確定n-th的十進制數字是零還是一位二進制形式,沒有實際上是在做轉換嗎?

回答

6

只需使用按位和。在C/C++,這將是:

if (flags & 1) { 
    // Bit zero is set. 
} 
if (flags & 2) { 
    // Bit one is set. 
} 
if (flags & 4) { 
    // Bit two is set. 
} 
... 

對於生產善,使用符號名的標誌掩碼代替幻數,1,2,4,8,等等

如果標誌在某些方面(例如,它們代表了一些幾何問題·十種空間維度)和代碼來處理每種情況下是一樣的同質化,你可以使用一個循環:

for (int f = 0; f < 10; ++f) { 
    if (flags & (1 << f)) { 
     // Bit f is set. 
    } 
} 
+0

WOW!很快!我想馬上接受你的回答,但顯然我應該等待至少9分鐘。非常感謝。 – 2010-04-25 07:24:56

+0

+1正在輸入類似的內容,但速度更快;) – 2010-04-25 07:28:50

1

你可以得到一個數字,有第n位設置,並與你的號碼進行和運算。如果結果爲零,您的編號沒有設置位。否則,它的確如此。也請看here

2

您可以使用按位和:

10 & 2^1 is true because 10 = 1010b 
           ^1 
8 & 2^1 is false because 8 = 1000b 
           ^0 
10 & 2^3 is true because 10 = 1010b 
          ^1