побитовое ИЛИ в iOS - PullRequest
       3

побитовое ИЛИ в iOS

1 голос
/ 02 июля 2011
enum {
   UIViewAnimationOptionLayoutSubviews            = 1 <<  0,
   UIViewAnimationOptionAllowUserInteraction      = 1 <<  1,
   UIViewAnimationOptionBeginFromCurrentState     = 1 <<  2,
   UIViewAnimationOptionRepeat                    = 1 <<  3,
   UIViewAnimationOptionAutoreverse               = 1 <<  4,
   UIViewAnimationOptionOverrideInheritedDuration = 1 <<  5,
   UIViewAnimationOptionOverrideInheritedCurve    = 1 <<  6,
   UIViewAnimationOptionAllowAnimatedContent      = 1 <<  7,
   UIViewAnimationOptionShowHideTransitionViews   = 1 <<  8,

   UIViewAnimationOptionCurveEaseInOut            = 0 << 16,
   UIViewAnimationOptionCurveEaseIn               = 1 << 16,
   UIViewAnimationOptionCurveEaseOut              = 2 << 16,
   UIViewAnimationOptionCurveLinear               = 3 << 16,

   UIViewAnimationOptionTransitionNone            = 0 << 20,
   UIViewAnimationOptionTransitionFlipFromLeft    = 1 << 20,
   UIViewAnimationOptionTransitionFlipFromRight   = 2 << 20,
   UIViewAnimationOptionTransitionCurlUp          = 3 << 20,
   UIViewAnimationOptionTransitionCurlDown        = 4 << 20,
};
typedef NSUInteger UIViewAnimationOptions;

Что именно означает это выражение: UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse.

Значение UIViewAnimationOptionRepeat равно 8 (в бине 1000), UIViewAnimationOptionAutoreverse равно 16 (в бине 10000).Таким образом, выражение UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse должно генерироваться так, как я думаю 16 (bin 10000) -> UIViewAnimationOptionReverse.

Ответы [ 4 ]

3 голосов
/ 02 июля 2011

Операция | определяется таблицей истинности

   | 0 | 1  
---+---+---
 0 | 0 | 1
 1 | 1 | 1

, то есть x | y == 0, только если оба значения x == 0 и y == 0.Оператор | работает со всеми битами машинного слова одновременно.Так что

  001000   (8)
| 010000  (16)
  ------------
  011000  (24)
1 голос
/ 02 июля 2011

UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse известен как «маска».

Если у вас есть переменная типа UIViewAnimationOptions, скажем:

 UIViewAnimationOptions a;

, вы можете применить маску к ней следующим образомthis:

 bool b = a && (UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse)

, чтобы определить, содержит ли a флаги.Если

a == 0x0000001;

, то

b == false;

, если

a == 0x0101001;  //-- completely arbitrary mask

, тогда

 b == true;

Так что вас на самом деле не интересует, что UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse оценивает, но только в результате логического добавления значения этого типа к флагам, которые вы хотите проверить.

0 голосов
/ 02 июля 2011
UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse

эквивалентно

01000
10000 |

результат которого

11000

что не 10000, как вы предполагали.

0 голосов
/ 02 июля 2011

Биты: or'd:

UIViewAnimationOptionRepeat      = 1 << 3 = 8  = 01000 in binary
UIViewAnimationOptionAutoreverse = 1 << 4 = 16 = 10000 in binary

   01000
OR 10000
--------
   11000

11000 в двоичном виде - 16 + 8 = 24 - целое число с установленным третьим и четвертым битами (считая от 0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...