何时使用按位运算符?

时间:2014-09-14 06:47:23

标签: java bit bitwise-operators

我最近开始学习Java,现在我正在覆盖位运算符部分。在学习的过程中,我想知道何时使用这种按位运算符,如果可能的话,我希望你能给我一些例子。谢谢!

3 个答案:

答案 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。