我使用按位运算符在变量中存储一些布尔值。我假设我适当地存储它们,虽然这是我的任务:
Dim lst as new List(of String)
Try
con.Open()
dr = cmd.ExecuteReader()
While dr.Read
For Each rw as datarow in dr.Rows()
lst.add(rw.item("Description"))
Next
End While
con.Close()
Catch ex As Exception
con.Close()
MsgBox(ex.Message) : Exit Sub
End Try
我不确定的是检查部分。我对逻辑和按位运算符之间的区别有一个简单的了解。以下是我检查值的方法:
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;
}
我知道最后一次胜利是不可取的(至少是考试给我的那些),但我想说明我的想法。
答案 0 :(得分:2)
我想知道我是否可以同时检查多个位
是的,你可以这样做,但你的代码不正确。
1 & 2 & 8
将始终为零。您需要使用1 | 2 | 8
。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)
答案 1 :(得分:2)
按位AND运算符将第一个操作数的每个位与...进行比较 第二个操作数的对应位。如果两个位都是1,那么 对应的结果位设置为1.否则,对应 结果位设置为0。
由于AND操作,如果要检查n。你必须使用2 ^(n-1)的值。如果该位置位,则按位运算的结果将大于零,这意味着值逻辑上为真,否则它将为零(或逻辑上为假)
if ((bit & 1) && (bit & 2) && (bit & 8))
这个表达式适合你想做的事情
if (bit && (1 & 2 & 8))
但是1&amp; 2&amp; 8将始终为零。正确的表达方式是:
if ((bit & (1 | 2 | 8)) == (1 | 2 | 8))
答案 2 :(得分:1)
您可以使用二进制文字进行比较:
pid
或作为一项功能:
#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;
}
答案 3 :(得分:0)
两者之间的区别很简单 &&-第一个语句为false表示无法检查第二个值 &-同时检查第一个值是true还是false的值
答案 4 :(得分:-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]
代替查找可能更安全。