https://zen.yandex.ru/media/zdgzdgzdg/bitovye-operacii-chast-1-inversiia-i-sdvig-5ef4445362346a31ca5889a6
25 June
188 full reads
3 min.
309 views. Unique page visitors.
188 full reads, 61%. Users who read to the end.
3 min. Average time to read the post.
Довольно часто битовую арифметику при обучении программированию обходят стороной, то есть даже если объясняют её правила, то не находят конкретных жизнеспособных примеров использования. В самом деле, если вы пишете драйвер для модема, она может быть нужна, но в обычной программе вряд ли... Или нет?
Давайте посмотрим.
(Рекомендуется сначала изучить материал про двоичную систему.)
Я буду говорить о семействе языков C, JavaScript, Java, PHP и подобных. Также я проверил насчет Питона, и там есть то же самое.
Операции, которые нам доступны с битами, это
"инверсия"_^_–_"исключающее_или"__>>_–_"сдвиг_вправо"'>& – "и"
| – "или"
~ – "инверсия"
^ – "исключающее или"
<< – "сдвиг влево"
>> – "сдвиг вправо"
Сначала рассмотрим те, что попроще. Например, операция "инверсия" заменяет единицы на нули, и нули на единицы. Проще некуда. Записывается она так:
a = ~a
То есть в данном случае – присвоить переменной a её же инвертированное значение. Если значение a равно 5, и допустим размер переменной 2 байта (тут не забываем о типах данных), то в битовом виде эти два байта выглядят так:
0000000000000101
~a даст нам:
1111111111111010
Это число 65530. Зачем нам нужна такая операция? Пока, наверно, не нужна, но её надо будет использовать вместе с другими операциями.
Дальше посмотрим на сдвиги влево и вправо. Они также очень просты, и просто сдвигают все биты в числе влево или вправо. И мы можем указать, сколько раз сдвинуть. Например:
a = a >> 2;
a = a << 1;
В первой строке мы сдвигаем все биты в числе a вправо 2 раза. Во второй строке сдвигаем эти же биты влево 1 раз. Если a = 5, и её размер 1 байт, то получаем следующий результат:
Do'stlaringiz bilan baham: |