我正在审查闹钟项目中的一些代码。该代码使用整数来存储重复的警报信息。也就是说,发生的警报就像每个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);
}
}
有人可以解释这两个功能的作用以及它们的工作原理吗?
答案 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。