Много ответов здесь описывая, что этот механик позволяет вам делать, но не почему вы хотели бы использовать его. Вот почему.
Короткая версия:
Эта запись помогает при взаимодействии с другими компонентами и связь с другими инженерами, потому что он говорит вам явно, что бит в слове быть набор или прозрачный, а не затеняя эту информацию внутри числовое значение.
Так что я мог позвонить вам по телефону и сказать: «Эй, какой бит для открытия файла ?» И вы бы сказали: «Бит 0». И я бы написал в своем коде open = 1 << 0
. Поскольку номер справа от <<
указывает номер бит.
.
Длинная версия:
Традиционно биты в слове нумеруются справа налево, начиная с нуля. Таким образом, младший бит - бит номер 0, и вы подсчитываете, как вы идете к наиболее значимый бит. Есть несколько benefits для маркировки битов этого способа .
Одним из преимуществ является то, что вы можете говорить о одном и том же бите независимо от размера слова. Например, я мог бы сказать, что как в 32-битном слове 0x384A, так и в 8-битовом слове 0x63 устанавливаются биты 6 и 1. Если вы пронумеровали свои биты в другом направлении, вы не смогли бы сделать это .
Еще одно преимущество заключается в том, что значение бита просто увеличивается до уровня бит . Например, двоичный код 0101
имеет биты 2 и 0. Бит 2 вносит значение 4 (2^2)
в число, а бит 0 вносит значение 1 (2^0). Таким образом, значение , конечно, 4 + 1 = 5.
Это длинное объяснение фона приводит нас к сути: нотация <<
сообщает вам номер бит, просто взглянув на него.
номер 1 сам по себе в операторе 1 << n
просто один бит установлен в позиции бита 0. Когда вы перемещаетесь, что число уехавших, вы затем двигаться, что установить бит в другую позицию в количестве. Удобно, сумма, которую вы сдвигаете , сообщает вам номер бит, который будет установлен.
1 << 5: This means bit 5. The value is 0x20.
1 << 12: This means bit 12. The value is 0x40000.
1 << 17: This means bit 17. The value is 0x1000000.
1 << 54: This means bit 54. The value is 0x40000000000000.
(You can probably see that this notation might be helpful if
you're defining bits in a 64-bit number)
Эта запись действительно очень удобно, когда вы взаимодействуете с другим компонентом, как отображения битов в слове на аппаратный регистр. Как и вы, у есть устройство, которое включается при записи в бит 7. Таким образом, инженер-инженер напишет лист данных, в котором говорится, что бит 7 позволяет устройству. И вы должны написать в свой код ENABLE = 1 << 7
. Легко.
О стрелять. Инженер просто отправил ошибочную информацию в техническое описание, в котором говорилось, что это , предположительно, бит 15, а не бит 7. Это нормально, просто измените код на .
Что делать, если ENABLE
были на самом деле, когда оба бита 7 и 1 были установлены одновременно?
ENABLE = (1 << 7) | (1 << 1)
.
Сначала это может показаться странным и тупым, но вы привыкнете к нему. И вы получите , если вам когда-либо явно нужно знать номер бит.
Я не знаю, кто голосует, чтобы закрыть это, но это не вопрос «в первую очередь на основе мнения». Это технический вопрос, в котором конкретно задается вопрос о том, в чем смысл «<<» в этом сценарии. –
@GrantWinney (не мои близкие голоса), но я вижу, как это «основано на мнениях», потому что вопрос в основном «почему кто-то использует« 1 << 2 », когда' 0x04' более читаем * для меня * ». –
Я никогда не говорил, что 0x04 более читабельна, и я не сравнил оба. Цель вопроса состоит в том, чтобы понять побочные эффекты этого утверждения (= возможность комбинировать флаги) – JSBach