C 常量的按位或

C 常量的按位或,c,operators,bit-manipulation,C,Operators,Bit Manipulation,在阅读一些文档时,我发现: unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 我不知道这是怎么回事。我读过C中的逐位运算符,但我不明白如何在一个int中拟合三个(或更多!)常量,然后再从int中提取它们?进一步挖掘文档,我还发现了这一点,这可能与: typedef enum { kCFCalendarUnitEra = (1 << 1), kCFCale

在阅读一些文档时,我发现:

unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
我不知道这是怎么回事。我读过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;
typedef枚举{

kCFCalendarUnitEra=(1数字1表示为00000000000000000000000000000001
(1如果您查看二进制数字,则每个数字要么为开(
1
)要么为关(
0

您可以使用逐位运算符有效地设置或查询各个位,以查看它们是否已设置

取8位值156。二进制形式为
10011100


设置的位对应于位
7
4
3
2
(值
128
16
8
4
)。您可以使用
1
1计算这些值。基本上,常量仅由一位表示,因此如果您有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
那你就可以了

int options = CONSTANT_1 | CONSTANT_3; // will have 0101 in binary.
正如您所看到的,每个位都代表特定的常数。因此,您可以在代码中使用二进制和二进制,并测试每个常数的存在,如:

if (options & CONSTANT_3)
{
    // CONSTANT_3 is set
}
我建议您阅读有关二进制操作的内容(它们的工作方式与逻辑运算符类似,但在位级别上),如果您对这些内容感兴趣,它将使您成为一名更好的程序员


干杯。

看起来像是objective-c?这是错误的标记吗?@SoapBox:这个例子确实取自Cocoa,但它实际上是直接的c。第二行代码不是c,从长远来看不是。@SoapBox:第二行确实与问题无关。
if (options & CONSTANT_3)
{
    // CONSTANT_3 is set
}