2

我正在查看闹钟项目中的一些代码。该代码使用整数来存储重复发生的警报信息。也就是说,每个 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);
    }
}

有人可以解释一下这两个功能的作用以及它们是如何工作的吗?

4

1 回答 1

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。

于 2013-04-25T22:42:12.007 回答