【发布时间】:2012-03-01 11:02:59
【问题描述】:
绝对基本的 Java 问题,我很难在 Google 上找到。以下是什么意思:
(7 & 8) == 0?
是否相当于写作:
7 == 0 || 8 == 0?
我写了一个快速的 main 来测试这个,它似乎是这样的。我只是想确保我没有遗漏任何东西。
【问题讨论】:
标签: java operators bitwise-operators notation
绝对基本的 Java 问题,我很难在 Google 上找到。以下是什么意思:
(7 & 8) == 0?
是否相当于写作:
7 == 0 || 8 == 0?
我写了一个快速的 main 来测试这个,它似乎是这样的。我只是想确保我没有遗漏任何东西。
【问题讨论】:
标签: java operators bitwise-operators notation
不。 & 是 bitwise and。如果在两个输入中都设置了相应的位,则它会设置一个位。因为在二进制中,7 是111,8 是1000,它们没有共同的位,所以结果是0。
对于您建议的内容,实际上没有任何简写语法,而不是一行。有一些变通方法——测试Set 或BitSet 中的成员资格,使用switch 语句——但没有什么比7 == 0 || 8 == 0 更高效、更简短。
【讨论】:
& 是按位与。给定输入的两位,以下给出按位与输出的位:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
在这种情况下,
7 in binary is 00000111
8 in binary is 00001000
--------
00000000, which is 0 in decimal.
假设你有 26 个而不是 8 个。
7 in binary is 00000111
26 in binary is 00011010
--------
00000010, which is 2 in decimal.
按位运算用于提取和操作包含在数字中的字段。
例如,假设您将 3 个字段打包成一个数字,每个 4 位中的两个 (0..15),一个和 3 个位 (0..7)。
// n = aaaabbbbccc
// Unpack the fields:
a = (n >> 7) & 0xF;
b = (n >> 3) & 0xF;
c = (n >> 0) & 0x7;
// Pack the fields:
n = (a << 7)
| (b << 3)
| (c << 0);
【讨论】:
& 是按位与运算符。这意味着您正在对代表 8 和 7 的位进行与运算:
7 -> 0111
8 -> 1000
这显然是 0。
这个wikipedia article 用你的确切例子很好地解释了它,并解释了其他按位运算符。
【讨论】:
这是位比较,工作正常,因为您正在与 7 和 8 进行比较,不能保证与其他情况。如果整数中的两个位都匹配,您将得到“1”而不是“0”的结果。
【讨论】:
& 有点比较,但也可以用作短路“和”。例如:
if((x == 3) && (y = 3/0)){
会一直抛出错误。然而,
if((x == 3) & (y = 3/0)){
只会在 x 等于 3 时抛出错误。如果 x 不等于 3,java 将不会费心评估其余的表达式,因为 False & 任何东西都会是 False。
【讨论】: