gramozeka пишет:или на пальцах растолкуйте
попробую...
итак: имеются три основные битовые операции:
1) инверсия
2)логическое И
0 & 0 => 0
0 & 1 => 0
1 & 0 => 0
1 & 1 => 1
3) логическое ИЛИ
0 | 0 => 0
0 | 1 => 1
1 | 0 => 1
1 | 1 => 1
В Си логические операции выполняются над всеми байтами сразу. Обычно используют тип unsigned, который имеет длину типичную для машинного слова (32 или 64 бита сегодня).
Есть ещё операция ^
x ^ y == x & ~y | ~x & y
Она работает как ИЛИ, только 1 ^ 1 => 0. Потому и называется "исключающее или", или короче XOR.
Приоритеты:
~ самый высокий (инверсия)
&
|
(из-за приоритетов & иногда называют "логическим умножением", а | "логическим сложением". Ну и из-за правил. Это действительно сложение, но по модулю 2. Т.е. двойка откидывается. Потому 1+1 => 2 => 2+0 => 0(mod2))
Биты двигать нельзя (К.О.), но слова из многих бит - можно. И влево, и вправо. Выдвигаемые биты бесследно исчезают (потому-то это слабое место - всегда надо помнить о потере информации).
x << n это сдвиг x влево на n битов. Операция бинарная, сам x не меняется.
x >> n это сдвиг вправо.
Сколько битов в unsigned - никто не знает. Биты выдвигаются в никуда. Потому пользоваться сдвигами в Си == ходить по минному полю.
Вот voral потренировался сегодня, завтра радостно что-то напишет. А после завтра это рухнет :O
Ибо, как именно двигаются слова - в стандарте не определено (особенно знаковые), а значит, сегодня они двигаются так, а завтра - эдак.
И тем не менее, их иногда приходится применять. Ибо - быстро. x<<1 это тоже самое, что x*2, но намного быстрее. (но опять-таки - не всегда. 128<<1 == 0, если 128 - это char).
Логические операции применяются шире. Иногда удобно делать логику именно на битах. ИМХО можно полагать, что unsigned это как минимум 32 бита. Хотя такой быдлокод ОБЯЗАТЕЛЬНО надо подробно прокоментировать, что-бы починить его, когда он сломается.
Кстати, чисто заменой побитовых операций на обычные, можно значительно ускорить работу программы (ага, как это и не парадоксально). В частности сказывается то, что CPU распараллеливает не только данные, но и операции. Потому далеко не факт, что одна операция над двумя битами будет быстрее, чем две операции над двумя числами. Ещё в iP1 появился второй конвейер.
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)