我最近开始学习Java,现在我正在覆盖位运算符部分。在学习的过程中,我想知道何时使用这种按位运算符,如果可能的话,我希望你能给我一些例子。谢谢!
答案 0 :(得分:2)
很好的例子 - 交换两个数字的按位异或(再次,在访谈中非常流行) - 没有任何第三个变量的快速交换值:
int a = 2; // a = 0010
int b = 11; // b = 1011
a = a ^ b; // a = 0010 ^ 1011 = 1001
b = a ^ b; // b = 1001 ^ 1011 = 0010 (as a at the beginning)
a = a ^ b; // a = 1001 ^ 0010 = 1011 (as b at the beginning)
您可以在wiki
中找到相关文章答案 1 :(得分:0)
有几个地方,虽然它们不是你经常使用的东西。您最终会在需要时使用它们。
一个很好的例子是检查一个数字是否是偶数:
if (num & 1 == 0) {}
它们在标志中也很有用,例如:
private static final int ENABLE_FOO = 0x0001;
private static final int ENABLE_BAR = 0x0002;
static int mask = (ENABLE_FOO | ENABLE_BAR);
public static void example() {
if (mask & ENABLE_FOO) { //If flag set.
do_foo();
}
if (mask & ENABLE_BAR) { //If flag set.
do_bar();
}
}
public static void doFooOnce() {
if (mask & ENABLE_FOO) { //If flag set.
do_foo();
}
mask &= ~ENABLE_FOO; //Bitwise and mask by the bitwise opposite of ENABLE_FOO
}
还有其他地方。只要知道你不会经常使用它们,但是当你这样做时它们会很有用。
答案 2 :(得分:0)
按位运算符用于位操作,即,当您想要查看数据结构的“血腥细节”时,这些数据结构在一天结束时是字节序列。
有很多教程可以解释按位运算符的各种用法,但是我只给你一个(IMHO)最有用的(至少对我而言)。
有时你想要处理很多布尔标志。您可以创建Map<String, Boolean>
和(例如)将此类映射的实例传递给某个方法(让我们称之为foo()
),即:
Map<String, Boolean> options = new HashMap<>();
// fill the map
foo(options);
显然我们可以使用enum和EnumMap代替字符串键。
或者我们可以定义一系列常量,如:
public static final int ONE = 1; public static final int TWO = 2; public static final int THREE = 4; public static final int FOUR = 8;
等。等
现在我们可以更改foo()
以获取int
参数并将其命名为:
foo(ONE | TWO);
foo(ONE | FOUR);
等
在某些情况下,这种表示法更具可读性;在大多数情况下,它可以节省内存并提供一些性能优势。
请注意,已经提到的EnumMap
是使用此技术实现的,因此您可以在大多数情况下使用它,同时享受效率和OOD。