Битовые операции, часть Инверсия и сдвиг


Download 30.19 Kb.
bet2/4
Sana13.04.2023
Hajmi30.19 Kb.
#1350169
1   2   3   4
Bog'liq
Битовые операции, часть 1. Инверсия и сдвиг. Битовые операции, часть 2.

00000101 – это 5
00000001 – это сдвинуть 2 раза вправо. Получилось 1.
00000010 – это сдвинуть 1 раз влево. Получилось 2.
Когда число сдвигается вправо или влево, то с одного конца у него "выпадает" крайний бит, а с другого на освободившееся место просто пишется 0. Выпадающий бит просто теряется, и его уже не вернуть. То есть сдвинув число столько раз, сколько в нём есть бит, вы вытолкнете из него все оригинальные биты и останутся только нули.

Сдвиг вправо
Приносят ли сдвиги пользу? Да, по нескольким причинам.
Посмотрите на обычное число 10. Это один десяток и ноль единиц. Если его умножить на 10, то получится 100. Это одна сотня, ноль десятков и ноль единиц. Если умножить опять на 10, получится 1000. Вы заметили, что когда мы умножаем на 10, то единица в числе каждый раз сдвигается на одну позицию влево? Это потому что мы считаем в десятичной системе. То же самое мы можем сделать в двоичной системе, но так как она двоичная, то умножать надо не на 10, а на 2. Смотрим:
00000001 – это 1
00000010 – это 2 (1 * 2)
00000100 – это 4 (2 * 2)
00001000 – это 8 (4 * 2)
И т.д. Но ведь получается, что умножение на 2 – это битовый сдвиг влево. А деление на 2 – это битовый сдвиг вправо. Значит, вместо умножения на 2 и деления на 2 можно пользоваться битовыми сдвигами влево и вправо. Например, так:
a = a << 3; // сдвиг влево 3 раза, умножение на 8 (2 * 2 * 2)
a = a >> 1; // сдвиг вправо 1 раз, деление на 2
Но зачем пользоваться битовыми сдвигами, когда есть обычные умножение и деление? Потому что битовые сдвиги работают существенно быстрее (это уже не актуально, см.комменты, но может где-то ещё осталось.) Почему тогда все не пользуются битовыми сдвигами? Потому что у них есть ограничения:

  1. Битовые сдвиги как замена умножения и деления работают только с целыми числами и всегда дают в результате целое число. То есть 5 >> 1 будет не 2.5, а 2. Это тоже бывает полезно, когда вам нужен именно целый результат.

  2. Битовыми сдвигами можно умножать и делить только на 2481632 и т.д.

  3. В результате обычной операции умножения может получиться слишком большой результат, который не помещается в переменную. Некоторые языки следят за тем, чтобы такого не случилось (например, выделяют побольше байт под результат). При битовых сдвигах ничего такого не происходит. Это просто сдвиги, поэтому всем всё равно. И значит, что если при сдвиге влево самый старший бит "выпадет", произойдет усечение данных.

Кроме того, битовыми сдвигами можно получать различные эффекты, например, из любого числа сделать четное:

Download 30.19 Kb.

Do'stlaringiz bilan baham:
1   2   3   4




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling