Ata*_*ete 14 java integer bit-manipulation function bitwise-operators
在应用程序框架中,我不断看到允许您将多个Int值(通常用于代替枚举)传递到函数中的框架.
例如:
public class Example
{
public class Values
{
public static final int ONE = 0x7f020000;
public static final int TWO = 0x7f020001;
public static final int THREE = 0x7f020002;
public static final int FOUR = 0x7f020003;
public static final int FIVE = 0x7f020004;
}
public static void main(String [] args)
{
// should evaluate just Values.ONE
Example.multiValueExample(Values.ONE);
// should evalueate just values Values.ONE, Values.THREE, Values.FIVE
Example.multiValueExample(Values.ONE | Values.THREE | Values.FIVE);
// should evalueate just values Values.TWO , Values.FIVE
Example.multiValueExample(Values.TWO | Values.FIVE);
}
public static void multiValueExample(int values){
// Logic that properly evaluates bitwise values
...
}
}
Run Code Online (Sandbox Code Playgroud)
那么multiValueExample中应该存在什么逻辑才能正确评估使用按位运算符传递的多个int值?
Can*_*der 32
你的值应该是2的幂.
这样,当你按位OR时,你不会丢失任何信息.
public static final int ONE = 0x01;
public static final int TWO = 0x02;
public static final int THREE = 0x04;
public static final int FOUR = 0x08;
public static final int FIVE = 0x10;
Run Code Online (Sandbox Code Playgroud)
等等
然后你可以这样做:
public static void main(String [] args) {
Example.multiValueExample(Values.ONE | Values.THREE | Values.FIVE);
}
public static void multiValueExample(int values){
if ((values & Values.ONE) == Values.ONE) {
}
if ((values & Values.TWO) == Values.TWO) {
}
// etc.
}
Run Code Online (Sandbox Code Playgroud)
如前所述,请考虑使用枚举而不是位值.
根据Effective Java 2:"项目32:使用EnumSet而不是位字段"
使用EnumSet对于内存使用非常有效并且非常方便.
这是一个例子:
package enums;
import java.util.EnumSet;
import java.util.Set;
public class Example {
public enum Values {
ONE, TWO, THREE, FOUR, FIVE
}
public static void main(String[] args) {
// should evaluate just Values.ONE
Example.multiValueExample(EnumSet.of(Values.ONE));
// should evalueate just values Values.ONE, Values.THREE, Values.FIVE
Example.multiValueExample(EnumSet.of(Values.ONE, Values.THREE, Values.FIVE));
// should evalueate just values Values.TWO , Values.FIVE
Example.multiValueExample(EnumSet.of(Values.TWO, Values.FIVE));
}
public static void multiValueExample(Set<Values> values) {
if (values.contains(Values.ONE)) {
System.out.println("One");
}
// Other checks here...
if (values.contains(Values.FIVE)) {
System.out.println("Five");
}
}
}
Run Code Online (Sandbox Code Playgroud)
您将整数值设置为2的幂,以便每个枚举值是二进制表示中的单个位.
int ONE = 0x1; //0001
int TWO = 0x2; //0010
int THREE = 0x4; //0100
int FOUR = 0x8; //1000
Run Code Online (Sandbox Code Playgroud)
然后使用逐位OR组合值和按位AND来测试设置值.
int test_value = (ONE | FOUR); //-> 1001
bool has_one = (test_value & ONE) != 0; //-> 1001 & 0001 -> 0001 -> true
Run Code Online (Sandbox Code Playgroud)