逻辑&按位AND

时间:2017-09-15 20:58:20

标签: c++ bit-manipulation logical-operators

我使用按位运算符在变量中存储一些布尔值。我假设我适当地存储它们,虽然这是我的任务:

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;  
}

我知道最后一次胜利是不可取的(至少是考试给我的那些),但我想说明我的想法。

5 个答案:

答案 0 :(得分:2)

  

我想知道我是否可以同时检查多个位

是的,你可以这样做,但你的代码不正确。

  1. 1 & 2 & 8将始终为零。您需要使用1 | 2 | 8
  2. 由于上述情况,
  3. bit && (1 & 2 & 8)不正确。
  4. 您可以使用:

    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处查看它。

答案 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]代替查找可能更安全。