0

私はドキュメンテーションを読んでいてNSCalendar、好奇心のためにもっと深く調べてCFCalendarUnit、これを見ました:

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),
   kCFCalendarUnitQuarter = (1UL << 11),
   kCFCalendarUnitWeekOfMonth = (1UL << 12),
   kCFCalendarUnitWeekOfYear = (1UL << 13),
   kCFCalendarUnitYearForWeekOfYear = (1UL << 14),
} CFCalendarUnit;

私はこれを次のように使用しています:

NSUInteger preservedComponents = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;

そして、それは戻ります124

だから私はこれをやろうとします:

NSUInteger preservedComponents = NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;

そして、私は得る30

私はそれを理解することはできません。使い方?

4

4 に答える 4

5

これらは単なる 2 進数です。1 << nは 2 進数で1n- 番目の位置がゼロで、それ以外はすべてゼロです。それらのいくつかの値をOR一緒に計算するには、定義でシフトされた位置の数に対応する位置に 1 を含む 2 進数を書き込み、1その数値を 10 進数表現に変換します。

例えば、

NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit

1(年号)、2(年)、3(月)、および4(日) の位置に 1 があり、残りのすべての位置に 0 があります。位置は、右からゼロから番号が付けられます。次のようになります。

Position:  76543210
           --------
Bit value: 00011110

これ00011110は 2 進表現で30は 10 進表現です。

于 2013-08-02T15:10:38.220 に答える
3

列挙型は、ビットごとのシフト演算 ( wiki ) を使用して値を生成し、列挙値への格納に使用される「int」にそれぞれ 1 ビットのみを設定します。これを行うことで、値を一緒に OR (ビットごとの演算) することができ、どのオプションが設定されているかを知ることができます。

を実際の数値として表示するpreservedComponentsことには意味がありますが、指定されたフォーマット/マスクで選択されたビットのセットを意味するため、すぐにはわかりません。

于 2013-08-02T15:11:59.850 に答える
1

書き込む(1 << k)と、k 番目 (右から 0 ベース) のビットのみがオンになっていることがわかります。書く(1 << a) | (1 << b)と、a 番目と b 番目のビットだけが設定されていることがわかります。

たとえば、124 を取得する場合、2 進数の 1111100 を扱っています。これは、このように数値を結合 (OR 演算子) したことを意味します。

(1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (i << 6)

間違った列挙型をコピーしたように見えるため、シンボリック名に関してこれが何を意味するのかわかりません。しかし、私はあなたが要点を得たと確信しています!:)

于 2013-08-02T15:11:02.827 に答える
1

|ビットごとの OR 演算子です。これは、同じ長さの 2 つのビット パターンを取り、対応するビットの各ペアに対して論理的包含 OR 演算を実行します。簡単に言えば、NSYearCalendarUnit、NSMonthCalendarUnit などを取り、OR 演算を実行すると、124andになります30。これは、フラグの組み合わせを引数として渡す非常に一般的な方法です。

于 2013-08-02T15:11:31.193 に答える