如何使用按位运算符将多个整数值传递给 Java 函数?
在应用程序框架中,我不断看到允许您将多个 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
...
}
}
那么 multiValueExample 中应该存在什么逻辑才能正确评估使用按位运算符传入的多个 int 值?
In application frameworks I keep seeing frameworks that allow you to pass in multiple Int values (generally used in place of an enum) into a function.
For example:
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
...
}
}
So what logic should exist in multiValueExample for me to properly evaluate multiple int values being passed in using the bitwise operator?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
您的值应该是 2 的幂。
这样,当您对它们进行按位或运算时,您就不会丢失任何信息。
等等
然后你可以这样做:
Your values should be powers of 2.
That way, you don't lose any information when you bitwise-OR them.
etc.
Then you can do this:
正如已经提到的,考虑使用枚举而不是位值。
根据 Effective Java 2:“第 32 项:使用 EnumSet 而不是位字段"
使用 EnumSet 对于内存使用也很方便。
这是一个例子:
As was already mentioned, consider use of enums instead of bit values.
According to Effective Java 2: "Item 32: Use EnumSet instead of bit fields"
Usage of EnumSet is quite effective for memory usage and very convenient.
Here is an example:
您将整数值设置为 2 的幂,以便每个枚举值都是二进制表示形式中的单个位。
然后使用按位或来组合值,并使用按位与来测试设置值。
You setup the integer values to be powers of two so that each enumerated value is a single bit in the binary representation.
Then you use bit-wise OR to combine values and bitwise AND to test set values.
您与 | 结合的值 (二进制 OR,不是逻辑 OR [即 ||])在其位表示中不得有重叠的“1”。 例如,
那么你可以将 ONE 和 TWO 结合起来,例如:
但你无法区分 ONE | 三中二,因为存在重叠位。 因此,您组合的数字应该是 2 的幂,这样它们在进行“或”运算时不会重叠。 要测试数字是否在“值”中传递,请执行以下操作:
为了更好地理解其工作原理和原理,我建议您阅读一些有关二进制表示和逻辑的内容。 一个好地方是《汇编艺术》第 3 章。
The values you combine with | (binary OR, not logical OR [which is ||]) must not have overlapping "1"s in their bit representation. For example,
Then you can combine ONE and TWO, for example:
But you can't distinguish ONE | TWO from THREE, because there are overlapping bits. The numbers you combine should thus be powers of two, such that they don't overlap when OR'ed together. To test if a number was passed in "values", do:
To better understand why and how this works, I recommend you read a bit on binary representation and logic. A good place is Chapter 3 of the Art of Assembly.
如果它们是 2 的幂,您将执行类似于下面代码中的“display”方法的操作。
这里是维基百科中关于该主题的链接,它应该解释为什么你想要 2 的幂。
Well if they are powers of 2 you would do something like the "display" method in the code below.
Here is a link in wikipedia on the topic as well which should explain why you want powers of 2.
当每一位都很重要时,使用位掩码很受欢迎。 今天实现此目的的另一种方法是使用更易于操作和扩展的枚举。
Using bit masks were popular when every bit counted. Another way to do this today is to use enums with are simpler to manipulate and extend.
首先,您不能以这种方式定义值来进行按位比较。 相反,设置不同的位:
其次,您可能应该使用 java.util.BitSet 用于这些类型的操作:
First, you can't define the Values that way to do bitwise comparisons. Instead, set different bits:
Second, you should probably be using java.util.BitSet for these sorts of operations:
有关按位运算的 Java 教程章节位于
http://java .sun.com/docs/books/tutorial/java/nutsandbolts/op3.html
非常简洁,但很有参考价值。
The Java Tutorial chapter on bitwise operations are at
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html
It is very concise but good for reference.