Java位移...请解释

时间:2013-04-25 22:37:23

标签: java

我正在审查闹钟项目中的一些代码。该代码使用整数来存储重复的警报信息。也就是说,发生的警报就像每个MWF一样。我理解整数只是一系列字节,每个字节都是一系列位,因此您可以使用该位信息创建一个整数,该整数对于一周中的每个日期模式都是唯一的。我不明白的是这些功能的逻辑:

// is a given day "set"?
private boolean isSet(int day) {
  return (mDays & (1 << day)) > 0;
}

// set a given day to on or off
public void set(int day, boolean set) {
    if (set) {
        mDays |= (1 << day);
    } else {
        mDays &= ~(1 << day);
    }
}

有人可以解释这两个功能的作用以及它们的工作原理吗?

1 个答案:

答案 0 :(得分:6)

isSet功能:

基本上是表达式:

(1 << day)

表示取数字1:

00000001

将其移至day个位置左侧。例如,如果day为3,则您有:

00001000

您可以使用按位&运算符来检查公共位。如:

00001000
&
00001000

将等于

00001000

然而,

00001000
&
00000001

将等于0.使用此功能,您可以检查该特定位是否设置,因为如果您&带有您正在寻找的位的数字,则可以保证如果该位匹配,则得到一个大于0的数字。

设置功能:

表达式:

mDays |= (1 << day);

相当于:

mDays = mDays | (1 << day);

这基本上会强制用(1 << day)表示的位为真。假设我们想要翻开第一位:

00001000 | 00000001
Equals:
00001001

表达式:

mDays &= ~(1 << day);

基本上会反过来做。 ~运算符将位反转(每1变为0,每0变为1)。这将确保您设置的位变为0,因为任何& 0都是0。现有的on位将保留,因为~(1 << day)中的其他位都是1。