Что означает «<<» в C? - PullRequest
       25

Что означает «<<» в C?

1 голос
/ 09 декабря 2011

что это значит?

#define WS_RECURSIVE    (1 << 0)

Я понимаю, что оно будет определять WS_Recursive (1 << 0), но что означает <<?

Спасибо!

Ответы [ 5 ]

20 голосов
/ 09 декабря 2011

<< является оператором левого сдвига . Это смещение числа 1 влево 0 битов, что эквивалентно числу 1.

Обычно используется для создания флагов , чисел, которые можно объединить вместе с | (бит или), и к ним могут применяться различные операции, такие как проверка, установлен ли флаг, настройка флаг, снятие флага и т. д.

Причина, по которой они могут объединяться друг с другом, не мешая друг другу, заключается в том, что каждый из них имеет степень , равную двум , и именно поэтому используется 1 << x, поскольку он дает степени двух:

1 << 0 == 2 <sup>0 == 1 == двоичный файл 0001
1 << 1 == 2 <sup>1 == 2 == двоичный файл 0010
1 << 2 == 2 <sup>2 == 4 == двоичный 0100
1 << 3 == 2 <sup>3 == 8 == двоичный файл 1000
и т.д.

Вы можете прочитать о битовых флагах здесь: http://www.codeproject.com/KB/tips/Binary_Guide.aspx

4 голосов
/ 09 декабря 2011

Это немного смещается влево.Таким образом, 1 << 0 на самом деле 1. Обычно он используется таким образом, когда вы хотите определить некоторые флаги, каждый из которых имеет один битовый набор, например: </p>

#define FLAG1 (1 << 0)
#define FLAG2 (1 << 1)
#define FLAG3 (1 << 2)
#define FLAG4 (1 << 3)
1 голос
/ 09 декабря 2011

Оператор << сдвигает левое значение влево на (правое значение) биты. Ваш пример ничего не делает! 1 сдвинутый 0 бит влево - все еще 1. Однако 1 << 1 равен 2, 1 << 2 равен 4 и т. Д. Является ли WS_RECURSIVE флагом в битовом поле?

1 голос
/ 09 декабря 2011

<< вычисляет побитовый сдвиг влево. Смещение 1 влево на 0 бит просто оставляет результат равным 1.

Я также заметил, откуда вы взяли свой код:

#define WS_RECURSIVE    (1 << 0)
#define WS_DEFAULT  WS_RECURSIVE
#define WS_FOLLOWLINK   (1 << 1)
#define WS_DOTFILES     (1 << 2)
#define WS_MATCHDIRS    (1 << 3)

Это способ создания битовых полей , где вы ИЛИ (|) флаги вместе, и И их (&), чтобы проверить, установлены ли они.

0 голосов
/ 09 декабря 2011

Это немного сдвиг.(1 << 1) равно 2, а (1 << 2) равно 4.(1 << 0) - это 1, что довольно глупо, но, по крайней мере, предварительно вычислено во время компиляции.

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