2017-09-15 72 views
0

我使用按位運算符來將一些布爾值存儲在一個變量中。我假設我存儲他們適當,雖然這裏是我的任務:邏輯&按位AND

int bit = 0; 
bit |= 1; 
bit |= 2; 
bit |= 4; 
bit |= 8; 

我不確定是檢查的一部分。我對邏輯按位運算符之間的區別有一個簡單的瞭解。下面是我如何檢查值:

if ((bit & 1) && (bit & 2) && (bit & 8)) { 
    std::cout << "a" << std::endl; 
} 
else { 
    std::cout << "b" << std::endl; 
} 

我想知道,如果那樣的條件是正確的(我做了一些測試,但我可能失去了一些東西),也是我想知道如果我可以檢查在同一時間多個位,例如:

if (bit && (1 & 2 & 8) { 
    std::cout << "a" << std::endl; 
} 
else { 
    std::cout << "b" << std::endl; 
} 

我知道,根據需要,最後將無法正常工作(至少這就是測試給了我),但我想說明我的想法。

+0

你自己去決定它是否正確。如果第1,2和8位被設置,是否應該是真的?如果是這樣,那麼這是正確的。 'if(bit &&(1&2&8))'提案在任何情況下都不會評估爲真,因此顯然是錯誤的。 –

+0

你的最後一個例子應該是'if(bit&(1 | 2 | 8))'。我認爲這會奏效。它會通過或者1,2,8一起創建一個掩碼,然後用'位'與AND來創建一個掩碼,如果第1,2或8位被設置,這將是真實的。 –

+0

是的,我知道這是符合我自己的標準的。然而,我想知道它是否會按要求工作(這就是我的測試所說的),或者如果我應該採取其他的選擇。 – Rezniaq

回答

1

我想知道如果我能在同一時間

是的,你可以這樣做檢查多個位,但你的代碼是不正確的。

  1. 1 & 2 & 8將始終爲零。您需要使用1 | 2 | 8
  2. bit && (1 & 2 & 8)由於上述原因不正確。

您可以使用:

if ((bit & (1 | 2 | 8)) == (1 | 2 | 8)) { 
    std::cout << "a" << std::endl; 
} 
else { 
    std::cout << "b" << std::endl; 
} 

表達(bit & 1) && (bit & 2) && (bit & 8)在邏輯上是一樣的表達(bit & (1 | 2 | 8)) == (1 | 2 | 8)

看到它https://ideone.com/KdGjiO工作。

+0

我試過你的示例代碼,它不能按預期工作。今天我用了一個類似的代碼(而不是位&(1 ...)我寫了&&(1 ...),但它也不起作用。如果我用16更改8,它將打印反正,我**或**編輯它在我的作業或不是。不應該它打印b如果我使用十六? – Rezniaq

+0

@Rezniaq,我不能告訴什麼可能是錯誤的沒有[mcve]。 –

+0

我不再使用而不是寫在我的問題上,我用你的語句取代了我的if語句,並將你的8語句改成了16,如果我複製我的主語,​​它將和重寫我的問題一樣,但如果你願意的話,我可以這樣做。 – Rezniaq

1

你可以使用二進制字面來比較:

#include <iostream> 

int main() { 

    int bit = 0; 
    bit |= 1; 
    bit |= 2; 
    bit |= 4; 
    bit |= 8; 

    if ((bit & 0b1111) == 0b1111) { 
     std::cout << "YES!"; 
    } 

    return 0; 
} 

或者作爲一個函數:

bool compareIntBool(const int bit, const int compareTo) { 
    return (bit & compareTo) == compareTo ? true : false; 
} 

然後把它用二進制文字:

if (compareIntBool(bit, 0b1111)) { 
    std::cout << "YES"; 
} 
+0

雖然你的回答並不直接解決我的問題,但這是我以前不知道的,所以我會感謝你。我從來沒有想過也沒有看到二進制文字。 – Rezniaq

2

的按位AND運算符將第一個操作數的每個位與進行比較第二個操作數的相應位。如果兩個位都爲1,則 相應的結果位設置爲1,否則,如果您要檢查n中的相應 結果位設置爲0。

由於與操作。你必須用2 ^(n-1)來代替它的值。如果該位被置位運算的結果將大於零,這意味着值是邏輯真,否則這將是零(或邏輯假)

if ((bit & 1) && (bit & 2) && (bit & 8)) 

這種表達是適合你想要做

什麼
if (bit && (1 & 2 & 8)) 

但是1 8將始終產生零。正確的表達是:

if ((bit & (1 | 2 | 8)) == (1 | 2 | 8)) 
+1

您需要使用'&'而不是'&&'。但是請注意,如果設置了3個位中的任何一個,則if(bit&(1 | 2 | 8))將評估爲真。如果你想檢查是否設置了所有3位,你必須使用if((bit&(1 | 2 | 8))==(1 | 2 | 8))'代替。 –

+0

我沒有注意到'&&'操作符,因爲我複製/粘貼。感謝您的糾正,我再次閱讀了這個問題,正如您所說,正確的表達式應該是'if((bit&(1 | 2 | 8))==(1 | 2 | 8))'。 – Shine

+0

非常感謝!我會標記你的答案是正確的,但我不能標記兩個。 R Sahu的也提供了我的第一個問題的直接答案(如果我可以一次檢查多個位)。我希望你不要生氣。 – Rezniaq

-1

這裏有一個替代實現你的第一個例子:

static const char * const table[] = { 
    "a", "a", "a", "a", 
    "a", "a", "a", "a", 
    "a", "a", "a", "b", 
    "a", "a", "a", "b", 
}; 

std::cout << table[bit] << std::endl; 

當然,這可能是比較安全時查找爲table[bit&0xF]代替。

+0

問題的目的是詢問如何使用位運算符,而不是如何根據位輸出值。這個答案沒有解決真正的問題。 –