Битовые операции, часть Инверсия и сдвиг
Download 30.19 Kb.
|
Битовые операции, часть 1. Инверсия и сдвиг. Битовые операции, часть 2.
- Bu sahifa navigatsiya:
- Приносят ли сдвиги пользу
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 Но зачем пользоваться битовыми сдвигами, когда есть обычные умножение и деление? Потому что Битовые сдвиги как замена умножения и деления работают только с целыми числами и всегда дают в результате целое число. То есть 5 >> 1 будет не 2.5, а 2. Это тоже бывает полезно, когда вам нужен именно целый результат. Битовыми сдвигами можно умножать и делить только на 2, 4, 8, 16, 32 и т.д. В результате обычной операции умножения может получиться слишком большой результат, который не помещается в переменную. Некоторые языки следят за тем, чтобы такого не случилось (например, выделяют побольше байт под результат). При битовых сдвигах ничего такого не происходит. Это просто сдвиги, поэтому всем всё равно. И значит, что если при сдвиге влево самый старший бит "выпадет", произойдет усечение данных. Кроме того, битовыми сдвигами можно получать различные эффекты, например, из любого числа сделать четное: Download 30.19 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling