1

NSDate に関する Apple のドキュメントを読んでいます。彼らのコード例の 1 つに、これまでに見たことのないものがあります: doc link。これがサンプルコードです。

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];

(OR) | の使用に本当に混乱しています。unitFlags に値を代入するときの演算子。誰かがそこで何が起こっているのか教えてもらえますか? それらは両方とも割り当てられますか、それとも最初にチェックされますか? nil が他方を探す場合は? 前もって感謝します。

4

2 に答える 2

2

それは OR 演算子 (||) ではありません。これはビットごとの OR 演算子であり、理解に問題がある可能性があります。

使用した列挙型の定義を見ると、互換性のために定義されており、基本列挙型がCFCalendarUnit. それでは、定義のスニペットを見てみましょうCFCalendarUnit

kCFCalendarUnitEra = (1UL << 1),
kCFCalendarUnitYear = (1UL << 2),
kCFCalendarUnitMonth = (1UL << 3),
kCFCalendarUnitDay = (1UL << 4),

列挙型が割り当てられた値を見てください。

kCFCalendarUnitEra = 1 leftShifted once = 2            = 00010
kCFCalendarUnitYear = 1 leftShifted twice = 4          = 00100
kCFCalendarUnitMonth = 1 leftShifted three times = 8   = 01000
kCFCalendarUnitDay = 1 leftShifted four times = 16     = 10000

バイナリの各結果には 1 つしか含まれていないことに注意してください。

ビットごとの OR 演算子を使用する:

NSUInteger unitFlags = (NSMonthCalendarUnit | NSDayCalendarUnit)
unitFlags = 01000 (bitwise-OR) 10000

「ビット単位」とは、各ビットを取得して演算を実行することを意味します。この場合、OR

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 ビット int に 32 のブール値の情報を格納し、情報をすばやく合成して取得できます。これにより、次のような方法が回避されます。

NSDateComponents *components = [gregorian 
                                      hasEraUnit:NO
                                      hasYearUnit:NO
                                      hasMonthUnit:YES
                                      hasDayUnit:YES
                                      hasHourUnit:NO
                                      ....
                                      hasYearForWeekOfYearUnit:NO
                                      fromDate:startDate
                                      toDate:endDate options:0];
于 2012-08-16T16:37:33.647 に答える
0

彼らはこの番号をフラグとして使用します。基本的に、受信側はフラグのどのビットが 1 であるかを探します。たとえば、整数の最初の 4 ビットをフラグとして使用するとします。これらの数値のどれが 1 で、どれが 0 であるかを調べて、フラグのどの要素がアクティブになっているかを確認します。これにより、同じ変数を使用して複数の情報を効率的に渡すことができます。

于 2012-08-16T16:17:34.187 に答える