iPhone SDK << смысл? - PullRequest
       6

iPhone SDK << смысл?

4 голосов
/ 03 сентября 2010

Привет еще один глупый простой вопрос. Я заметил, что в некоторых typedefs в каркасах Apple используются символы "<<" Может кто-нибудь сказать мне, что это значит?:


enum {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
typedef NSUInteger UIViewAutoresizing;


Редактировать: Хорошо, теперь я понимаю, как и почему вы должны использовать левое смещение, мой следующий вопрос: как мне проверить, имеет ли значение определенную черту с использованием и если / тогда оператор или метод switch / case?

Ответы [ 5 ]

7 голосов
/ 03 сентября 2010

Это способ создания констант, которые было бы легко смешивать. Например, у вас может быть API для заказа мороженого, и вы можете выбрать любой вкус ванили, шоколада и клубники. Вы можете использовать логические значения, но это немного тяжело:

- (void) iceCreamWithVanilla: (BOOL) v chocolate: (BOOL) ch strawerry: (BOOL) st;

Хорошая уловка для решения этой проблемы - использование чисел, где вы можете смешивать ароматы с помощью простого добавления. Допустим, 1 для ванили, 2 для шоколада и 4 для клубники:

- (void) iceCreamWithFlavours: (NSUInteger) flavours;

Теперь, если у номера установлен самый правый бит, в нем есть ванильный аромат, другой бит обозначает шоколад, а третий справа - клубника. Например, ванильный + шоколадный будет 1 + 2 = 3 десятичных (011 в двоичном формате).

Оператор битового смещения x << y принимает левое число (x) и сдвигает свои биты y раз. Это хороший инструмент для создания числовых констант:

1 << 0 = 001 // vanilla
1 << 1 = 010 // chocolate
1 << 2 = 100 // strawberry

Вуаля! Теперь, когда вам нужен вид с гибким левым полем и гибким правым полем, вы можете смешивать флаги, используя побитовую или: FlexibleRightMargin | FlexibleLeftMargin1<<2 | 1<<0100 | 001101. На принимающей стороне метод может маскировать интересующий бит, используя логические и:

// 101 & 100 = 100 or 4 decimal, which boolifies as YES
BOOL flexiRight = givenNumber & FlexibleRightMargin;

Надеюсь, это поможет.

4 голосов
/ 03 сентября 2010

<< означает, что все биты в выражении с левой стороны сдвинуты влево на величину с правой стороны от оператора </p>

, поэтому 1 << 1 означает: 0001 становится 0010 (это двоичные числацифры) </p>

другой пример: 0001 0100 << 2 = 0101 0000 </p>

большая часть оставшегося временного сдвига равна умножению на 2.
исключение: когда установлены старшие биты иВы сдвигаете их влево (в 16-битном целом числе 1000 0000 0000 0000 << 1), они будут отброшены или обернуты (я не знаю, как это делается на каждом языке) </p>

1 голос
/ 04 сентября 2010

Бит Сдвиг !!!

Например

500 >> 4 = 31,

Original: 111110100
1st Shift:011111010
2nd Shift:001111101
3rd Shift:000111110
4th Shift:000011111 which equals 31.

То же, что и

500/16 = 31

500/2 ^ 4 = 31

1 голос
/ 03 сентября 2010

Это сдвиг бит .

На языках, основанных на C, левые и операторы правого сдвига "<<" и «>>» соответственно. Номер места для сдвига дается как второй аргумент оператора сдвига.

0 голосов
/ 03 сентября 2010

Битовый сдвиг влево.Для получения дополнительной информации см. статью Википедии .

...