2010-09-03 6 views
4

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

 

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

 

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

ответ

7

Это способ создания констант, которые легко смешивать. Например, у вас может быть 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 

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

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

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

0

Побитовый сдвиг влево. Для получения дополнительной информации см. the Wikipedia article.

+0

Я не уверен, что это значит. Могли бы вы объяснить? –

+0

Дополнительные ссылки с пояснениями (обновлен исходный ответ с помощью ссылки в Википедии): http://msdn.microsoft.com/en-us/library/f96c63ed.aspx http://www.cprogramming.com/tutorial/ bitwise_operators.html – SteamTrout

1

Его a bit shift.

В C-вдохновило языках, слева и операторов правого сдвига являются "< <" и ">>", соответственно. Число мест для сдвига дается как второй аргумент операторам сдвига.

4

< < означает, что все биты в выражении на левой стороне смещены влево на величину на правой стороне оператора

около того 1 < < 1 означает: 0001 становится 0010 (те представляют собой двоичные числа)

еще один пример: < 2 = 0101 0000

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

1

Бит-сдвиг !!!

Например

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

Смежные вопросы