Побитовые операции
Используйте побитовые операторы для изменения отдельных битов числовых операндов.
Побитовые операторы связывают слева направо. Единственным исключением является оператор not, который не связывается справа налево.
Обзор побитовых операторов
Оператор | Операция |
---|---|
and | побитовое AND; сравнивает пары бит и возвращает 1, если оба бита равны 1, в противном случае он возвращает 0 |
or | побитовое (включающее) OR; сравнивает пары бит и генерирует результат 1, если один или оба бита равны 1, в противном случае он возвращает 0 |
xor | побитовое исключающе OR (XOR); сравнивает пары бит и генерирует результат 1, если бит является дополнительным, в противном случае он возвращает 0 |
not | побитовое дополнение (унарное); инвертирует каждый бит |
shl | побитовый сдвиг влево; перемещает биты влево, отбрасывает крайний левый бит и назначает 0 в самый правый бит. |
shr | побитовый сдвиг вправо; перемещает биты вправо, отбрасывает правый правый бит, и если unsigned присваивает 0 самому большему биту, в противном случае знак расширяет |
Логические операции на битовом уровне
and | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
or | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
xor | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
not | 0 | 1 |
---|---|---|
1 | 0 |
Побитовые операторы and
, or
, и xor
выполняют логические операции над соответствующими парами битов их операндов. Оператор не дополняет каждый бит своего операнда. Например:
$1234 and $5678 // равно $1230 { поскольку .. $1234 : 0001 0010 0011 0100 $5678 : 0101 0110 0111 1000 ---------------------------- и : 0001 0010 0011 0000 .. то получится, $1230 }
// По аналогии $1234 or $5678 // равно $567C $1234 xor $5678 // равно $444C not $1234 // равно $EDCB
Беззнаковые и конвертация
Если число преобразуется из менее сложного в более сложный тип данных, верхние байты заполняются нулями. Если число преобразуется из более сложного и менее сложного типа данных, данные просто усекаются (верхние байты теряются).
Например:
var a : byte; b : word; ... a := $AA; b := $F0F0; b := b and a; { a дополняется нулями; b становится равным $00A0 }
Знаковые и конвертация
Если число преобразуется из менее сложного в более сложный тип данных, верхние байты заполняются единицами, если знаковый бит равен 1 (число отрицательно); верхние байты заполняются нулями, если знаковый бит равен 0 (число положительное). Если число преобразуется из более сложного и менее сложного типа данных, данные просто усекаются (верхние байты теряются).
Например:
var a : byte; b : word; ... a := -12; b := $70FF; b := b and a; { a is sign extended, with the upper byte equal to $FF; b becomes $70F4 }
Побитовые операторы сдвига
Бинарные операторы shl
и shr
перемещает биты левого операнда на число позиций, заданных правым операндом, влево или вправо соответственно. Правильный операнд должен быть положительным и меньше 255.
Со сдвигом влево (shl
), самый левый бит отбрасывается, и «новые» биты справа заполняются нулями. Таким образом, сдвиг неподписанного операнда слева на n позиций эквивалентен его умножению на 2n если все отброшенные биты равны нулю.Это также верно для знаковых операндов, если все отброшенные биты равны знаковым битам.
С правым сдвигом (shr
), самый правый бит отбрасываются, а «освобожденные» биты слева назначаются нулями (в случае беззнакового операнда) или значением знакового бита (в случае знакового операнда). Смещение операнда вправо на n позиций эквивалентно делению на 2n.