按位OR表示布尔数组

时间:2016-03-10 20:07:41

标签: java android bitwise-operators binary-operators

首先,我是一个非常新的,并且对于按位操作人员的了解很少,如果我的问题看起来很愚蠢,那就很抱歉..

所以我的Android应用程序中有5个复选框,这些复选框的状态需要与后端同步。但是,不是一个简单的JSON对象,其中有5个元素具有true / false值,我得到一个整数(例如13),并且需要发送一个整数来表示所有复选框的状态。 API文档说明如下:

  

FromUri Int32 visibility:visibility =“OR”bit的操作   以下值None = 0,NameVisibile = 1 | WebVisible = 2 |   MobileVisible = 4 | DOBVisible = 8 | AddressVisible = 16

所以我想这意味着,如果我检查了WebVisibleMobileVisibleDOBVisible复选框,我应该2 + 4 + 8 = 14并发送数字14来表示状态我的复选框?

并且如果我从BE获得一些整数,我应该用这种方式解释它吗?

public void test(int value){
    if (value >= 16){
        addressVisible = true;
        value -= 16;
    } else {
        addressVisible = false;
    }

    if(value >= 8){
        dobVisible = true;
        value -= 8;
    } else {
        dobVisible = false;
    }

    if(value >= 4){
        mobileVisible = true;
        value -= 4;
    } else {
        mobileVisible = false;
    }

    if(value >= 2){
        webVisible = true;
        value -= 2;
    } else {
        webVisible = false;
    }

    if(value >= 1){
        nameVisibile = true;
    } else {
        nameVisibile = false;
    }
}

这是解决此问题的正确方法吗?可能有更多“智能”方法使用按位运算符执行相同的操作?

1 个答案:

答案 0 :(得分:2)

这种方式非常简单。

Flag            Value   Binary

None            0       0x00000
NameVisibile    1       0x00001
WebVisible      2       0x00010
...

按位OR可以这样工作

0 | 0 = 0
1 | 0 = 1
0 | 1 = 1
1 | 1 = 1

因此当OR(|)将多个标志组合在一起时,您将保留每个标志的状态,因为每个标志只占二进制值中的一个位置。 例如

NameVisible | WebVisible = 0x00011

现在,来解决你的问题。要提取值,可以使用AND运算符。和这样工作

0 & 0 = 0
1 & 0 = 0
0 & 1 = 0
1 & 1 = 1

所以从我们的示例0x00011和AND(&)中获取值,并使用您正在测试的标志,例如WebVisible

Value        WebVisible 
0x00011  &   0x00010     = 0x00010

由于该值不为零,因此您知道WebVisible为真。

以下是您可以根据自己的需求调整的具体代码。

public void test(int value){
    int addressVisibleFlag = 16;
    ...

    addressVisible = (value & addressVisibleFlag) != 0;
    ....
}

希望这会有所帮助。这基本上只是对所涉逻辑的概述。这是未经测试的,我对Android的经验几乎为零,但您应该能够做到这一点。