【问题标题】:Bitwise OR to represent an array of booleans按位或表示布尔数组
【发布时间】:2016-06-25 20:54:49
【问题描述】:

首先,我是个新手,对位操作人员的了解很差,如果我的问题看起来很愚蠢,很抱歉..

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

FromUri Int32 visibility : visibility = "OR" 位运算 以下值无 = 0,NameVisibile = 1 |网络可见 = 2 | 移动可见 = 4 | DOBVisible = 8 |地址可见 = 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;
    }
}

这是解决此问题的正确方法吗?可能有更多的“智能”方法来使用位运算符来做同样的事情吗?

【问题讨论】:

  • AND 在掩码中更常见:if (value & 0x10) {}。这样就不需要修改值了,每个测试都是独立的。
  • @njzk2 写的是真的。然而,他报告的声明不是有效的 Java 代码(int 不能被评估为 boolean)。因此,正确的声明是if ((value & 0x10) != 0) { ... }

标签: java android bitwise-operators binary-operators


【解决方案1】:

它的工作方式相当简单。

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

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

NameVisible | WebVisible = 0x00011

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

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

因此,从我们的示例 0x00011 中获取值,并将其与您正在测试的标志(例如 WebVisible)进行 AND (&)

Value        WebVisible 
0x00011  &   0x00010     = 0x00010

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

这里有具体的代码,您可以根据自己的需要进行调整。

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

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

希望这会有所帮助。这基本上只是所涉及的逻辑的概述。这是未经测试的,我对 Android 的体验几乎为零,但你应该可以用它做点什么。

【讨论】:

    猜你喜欢
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多