首先,我是一个非常新的,并且对于按位操作人员的了解很少,如果我的问题看起来很愚蠢,那就很抱歉..
所以我的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
所以我想这意味着,如果我检查了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;
}
}
这是解决此问题的正确方法吗?可能有更多“智能”方法使用按位运算符执行相同的操作?
答案 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的经验几乎为零,但您应该能够做到这一点。