首先,我是个新手,对位运算人员了解甚少,如果我的问题看起来很愚蠢,我很抱歉。
所以我的 Android 应用程序中有 5 个复选框,这些复选框的状态需要与后端同步。但我得到的是一个整数(例如 13),而不是一个包含 5 个具有真/假值的元素的简单 JSON 对象,并且需要发送一个整数来表示所有复选框的状态。 API 文档说明如下:
FromUri Int32 visibility : visibility = "OR" operation of bit for following values None = 0, NameVisibile = 1 | WebVisible = 2 | MobileVisible = 4 | DOBVisible = 8 | AddressVisible = 16
所以我想这意味着如果我选中了 WebVisible
、MobileVisible
和 DOBVisible
复选框,我应该执行 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;
}
}
这是解决这个问题的正确方法吗?可能有更多“聪明”的方法来使用按位运算符来做同样的事情?
最佳答案
其工作方式相当简单。
Flag Value Binary
None 0 0x00000
NameVisibile 1 0x00001
WebVisible 2 0x00010
...
按位或的工作原理
0 | 0 = 0
1 | 0 = 1
0 | 1 = 1
1 | 1 = 1
因此,当您对多个标志进行 OR (|) 运算时,您会保留每个标志的状态,因为每个标志在二进制值中仅占据一个位置。 例如
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 为 true。
这是您可以根据需要进行调整的具体代码。
public void test(int value){
int addressVisibleFlag = 16;
...
addressVisible = (value & addressVisibleFlag) != 0;
....
}
希望这有帮助。这基本上只是所涉及逻辑的概述。这是未经测试的,我对 Android 的经验几乎为零,但你应该能够用它做一些事情。
关于java - 按位或来表示 boolean 值数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35926212/