逻辑与按位与
Logical & bitwise AND
我正在使用按位运算符在变量中存储一些布尔值。我假设我适当地存储了它们,尽管这是我的作业:
int bit = 0;
bit |= 1;
bit |= 2;
bit |= 4;
bit |= 8;
我不确定的是检查部分。我对 logical 和 bitwise 运算符之间的区别有一个简单的了解。这是我检查值的方法:
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;
}
我知道最后一个不会按预期工作(至少那是测试给我的结果),但我想说明我的想法。
i want to know if i can check multiple bits at the same time
是的,你可以这样做,但你的代码不正确。
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)
相同
查看它在 https://ideone.com/KdGjiO 的工作情况。
您可以使用二进制文字来比较:
#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";
}
The bitwise AND operator compares each bit of the first operand to the
corresponding bit of the second operand. If both bits are 1, the
corresponding result bit is set to 1. Otherwise, the corresponding
result bit is set to 0.
自AND运算如果要查n。你必须用 2^(n-1) 和它的值的一部分。如果该位被设置,则按位运算的结果将大于零,这意味着该值在逻辑上为真,否则将为零(或逻辑上为假)
if ((bit & 1) && (bit & 2) && (bit & 8))
这个表达很适合你想做的事情
if (bit && (1 & 2 & 8))
但是 1 & 2 & 8 将始终产生零。正确的表达方式是:
if ((bit & (1 | 2 | 8)) == (1 | 2 | 8))
这是第一个示例的替代实现:
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]
进行查找可能更安全。
两者的区别很简单
&&-第一个语句是假的意味着它不能检查第二个值
&-它检查第一个值是真还是假
我正在使用按位运算符在变量中存储一些布尔值。我假设我适当地存储了它们,尽管这是我的作业:
int bit = 0;
bit |= 1;
bit |= 2;
bit |= 4;
bit |= 8;
我不确定的是检查部分。我对 logical 和 bitwise 运算符之间的区别有一个简单的了解。这是我检查值的方法:
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;
}
我知道最后一个不会按预期工作(至少那是测试给我的结果),但我想说明我的想法。
i want to know if i can check multiple bits at the same time
是的,你可以这样做,但你的代码不正确。
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)
查看它在 https://ideone.com/KdGjiO 的工作情况。
您可以使用二进制文字来比较:
#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";
}
The bitwise AND operator compares each bit of the first operand to the corresponding bit of the second operand. If both bits are 1, the corresponding result bit is set to 1. Otherwise, the corresponding result bit is set to 0.
自AND运算如果要查n。你必须用 2^(n-1) 和它的值的一部分。如果该位被设置,则按位运算的结果将大于零,这意味着该值在逻辑上为真,否则将为零(或逻辑上为假)
if ((bit & 1) && (bit & 2) && (bit & 8))
这个表达很适合你想做的事情
if (bit && (1 & 2 & 8))
但是 1 & 2 & 8 将始终产生零。正确的表达方式是:
if ((bit & (1 | 2 | 8)) == (1 | 2 | 8))
这是第一个示例的替代实现:
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]
进行查找可能更安全。
两者的区别很简单 &&-第一个语句是假的意味着它不能检查第二个值 &-它检查第一个值是真还是假