Objective c 使用|(或)运算符为整数赋值?

Objective c 使用|(或)运算符为整数赋值?,objective-c,integer,bit-manipulation,Objective C,Integer,Bit Manipulation,我正在阅读苹果公司关于NSDate的文档。在他们的一个代码示例中,我看到了一些我以前从未见过的东西: . 下面是示例代码 NSDate *startDate = ...; NSDate *endDate = ...; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSUInteger unitFlags = NSMont

我正在阅读苹果公司关于NSDate的文档。在他们的一个代码示例中,我看到了一些我以前从未见过的东西: . 下面是示例代码

NSDate *startDate = ...;
NSDate *endDate = ...;

NSCalendar *gregorian = [[NSCalendar alloc]
                 initWithCalendarIdentifier:NSGregorianCalendar];

NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;

NSDateComponents *components = [gregorian components:unitFlags
                                          fromDate:startDate
                                          toDate:endDate options:0];
NSInteger months = [components month];
NSInteger days = [components day];

在为unitFlags赋值时使用(OR)|运算符真的让我很困惑。有人能告诉我那里发生了什么事吗?他们都被分配了吗?还是先检查,如果nil寻找另一个?提前谢谢。

他们用这个号码作为标志。基本上,接收器将查找标志上哪些位是1。例如,假设您使用整数的前4位作为标志,您可以查看这些数字中的哪些是1,哪些是零,以了解标志的哪些元素被激活。这允许您使用同一变量有效地传递多条信息。

这不是OR运算符(| |)。这是按位OR运算符,可能是您理解的问题

如果查看所用枚举的定义,您将看到它们是为兼容而定义的,基本枚举是
CFCalendarUnit
。 让我们看一看
CFCalendarUnit

kCFCalendarUnitEra = (1UL << 1),
kCFCalendarUnitYear = (1UL << 2),
kCFCalendarUnitMonth = (1UL << 3),
kCFCalendarUnitDay = (1UL << 4),
请注意,二进制中的每个结果只有一(1)个

使用按位OR运算符:

NSUInteger unitFlags = (NSMonthCalendarUnit | NSDayCalendarUnit)
unitFlags = 01000 (bitwise-OR) 10000
“按位”表示获取每个位并执行操作,在这种情况下,或

01000 |
10000 
=====
11000

然后将此值传递给日历,日历将使用如下命令解码信息:

if (unitFlags & kCFCalendarUnitMonth == kCFCalendarUnitMonth) //Where & is the bitwise-AND operator

11000 &    //Unit Flags
01000      //Value of Month
=====
01000      //If unit flags contains month flag, month flag is returned.

使用这种技术。通过“标记”每个位,可以在单个32位整数中存储32个布尔信息片段,并快速合成和检索信息。这避免了以下方法:

NSDateComponents *components = [gregorian 
                                      hasEraUnit:NO
                                      hasYearUnit:NO
                                      hasMonthUnit:YES
                                      hasDayUnit:YES
                                      hasHourUnit:NO
                                      ....
                                      hasYearForWeekOfYearUnit:NO
                                      fromDate:startDate
                                      toDate:endDate options:0];

谢谢你的回答。我仍然想知道在所示的特定示例中这是如何工作的。在函数级别上,我只是将两个整数放入一个变量中(使用|),然后当我稍后调用它时,它们再次弹出?如果我理解正确的话,它们是按顺序出现的吗?它们的局限性是什么?我可以分配三个变量吗?您可以使用这种操作,例如,保存一年中某个事件重复发生的月份。您可以说LSB是一年中的第一个月,因此,如果您有数字1(000000000001基数2),则表示只有一月是活动的。如果您有17(0000000 10001基数2),则表示您有一月和五月。如果您看到这一点,您就会意识到可以使用位标志传递大量信息(取决于上下文)。非常详细的解释!令人惊叹的。谢谢
NSDateComponents *components = [gregorian 
                                      hasEraUnit:NO
                                      hasYearUnit:NO
                                      hasMonthUnit:YES
                                      hasDayUnit:YES
                                      hasHourUnit:NO
                                      ....
                                      hasYearForWeekOfYearUnit:NO
                                      fromDate:startDate
                                      toDate:endDate options:0];