常数的按位OR

ryy*_*yst 9 c bit-manipulation operators

在阅读这里的一些文档时,我遇到了这个:

unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
Run Code Online (Sandbox Code Playgroud)

我不知道这是如何工作的.我读了C中的按位运算符,但我不明白你如何在一个int中包含三个(或更多!)常量,以后能够以某种方式从int中提取它们?进一步深入了解文档,我也发现了这个,这可能是相关的:

typedef enum {
   kCFCalendarUnitEra = (1 << 1),
   kCFCalendarUnitYear = (1 << 2),
   kCFCalendarUnitMonth = (1 << 3),
   kCFCalendarUnitDay = (1 << 4),
   kCFCalendarUnitHour = (1 << 5),
   kCFCalendarUnitMinute = (1 << 6),
   kCFCalendarUnitSecond = (1 << 7),
   kCFCalendarUnitWeek = (1 << 8),
   kCFCalendarUnitWeekday = (1 << 9),
   kCFCalendarUnitWeekdayOrdinal = (1 << 10),
} CFCalendarUnit;
Run Code Online (Sandbox Code Playgroud)

(1 << 3)语句/变量如何工作?我很抱歉,如果这是微不足道的,但是有人可以通过解释或者发布一个好的解释链接来启发我吗?

Fra*_*oto 10

基本上,常量只用一位表示,所以如果你有一个32位整数,你可以在其中输入32个常量.你的常量必须是2的幂,所以它们只需要一个"set"位来表示.

例如:

#define CONSTANT_1 0x01 // 0001 in binary
#define CONSTANT_2 0x02 // 0010 in binary
#define CONSTANT_3 0x04 // 0100 in binary
Run Code Online (Sandbox Code Playgroud)

那么你可以做到

int options = CONSTANT_1 | CONSTANT_3; // will have 0101 in binary.
Run Code Online (Sandbox Code Playgroud)

如您所见,每个位代表该特定常量.因此,您可以在代码中使用二进制AND并测试每个常量的存在,例如:

if (options & CONSTANT_3)
{
    // CONSTANT_3 is set
}
Run Code Online (Sandbox Code Playgroud)

我建议你阅读二进制操作(它们像LOGICAL操作符一样工作,但是在位级别),如果你理解这些东西,它会让你对程序员更好一些.

干杯.