[英]C++ Logical AND Operator
我正在嘗試使用邏輯AND運算符,但出現了一些意外行為。
#include <iostream>
using namespace std;
int main() {
unsigned flags = 0;
cout << "flags = " << flags << endl;
for(int i=0; i<3; ++i) {
flags &= (1 << i);
cout << "Anding with " << (1 << i) << endl;
cout << "flags = " << flags << endl;
}
return 0;
}
實際輸出:
flags = 0
Anding with 1
flags = 0
Anding with 2
flags = 0
Anding with 4
flags = 0
預期產量:
flags = 0
Anding with 1
flags = 1
Anding with 2
flags = 3
Anding with 4
flags = 7
請注意,我可以通過在程序中簡單地用&替換+來獲得預期的輸出。 但是我想知道我在這里做錯了什么?
這是按位排列的常見錯誤,...人們認為a & b
意思是“將a
所有位與b
所有位組合在一起……不然。這意味着”返回在兩個位中設置的位a
和 b
”。
如果a為1,b為2,則二進制表示形式為01
和10
...沒有共同點! 結果當然是0。
您需要使用按位或 。 a | b
a | b
表示“返回了在任一組中的所有的位a
或 b
。
如果a為1,b為2,則二進制表示形式為01
和10
,因此結果為11
或期望的3。
將這些操作視為集合操作“ 交集 ”和“ 聯合 ”,而不是二進制操作“ 和 ”和“ 或 ”,可能會有所幫助。
你混了|
和&
。 您的預期結果對應於以下迭代:
flags |= (1 << i);
|=
的按位OR將“添加”位到您的位集flags
,而按位AND只能刪除位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.