Побитовые операции

Используйте побитовые операторы для изменения отдельных битов числовых операндов.

Побитовые операторы связывают слева направо. Единственным исключением является оператор 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.