Поразрядные операции с числами


Поразрядные или побитовые операции выполняются над отдельными разрядами целых чисел. Каждое число имеет определенное представление в памяти. Например, число 5 представлено в двоичном виде следующим образом: 101. Число 7 - 111.

В Swift есть следующие поразрядные операции:

& (операция логического умножения или операция И)

сравнивает два соответствующих разряда двух чисел и возвращает 1, если соответствующие разряды обоих чисел равны 1. Иначе возвращает 0.

1
2
3
4
let a = 6 // 110
let b = 5 // 101
let c = a & b // 100 - 4
print(c) // 4
В данном случае число a равно 6, то есть 110 в двоичном формате, а число b равно 5 или 101 в двоичном формате. В итоге при выполнении операции получится число 4 или 100.

| (операция логического сложения или операция ИЛИ)

возвращает 1, если хотя бы один из соответствующих разрядов обоих чисел равен 1. Иначе возвращает 0.

1
2
3
4
let a = 6 // 110
let b = 5 // 101
let c = a | b // 111 - 7
print(c) // 7
^ (операция исключающее ИЛИ)

возвращает 1, если соответствующие разряды обоих чисел не равны.

1
2
3
4
let a = 6 // 110
let b = 5 // 101
let c = a ^ b // 011 - 3
print(c) // 3
~ (операция инверсии или операция НЕ)

принимает один операнд и инвертирует все его биты. Если разряд равен 1, то он получает значение 0 и наоборот, если разряд равен 0, то он становится равным 1.

1
2
3
let a = 6 // 000000000000000110
let b = ~a // 111111111111111001
print(b) // -7
<< (поразрядный сдвиг влево)

Сдвигает биты первого операнда влево на количество разрядов, заданное вторым операндом. То есть первый операнд справа дополняется нулями, количество которых равно второму операнду.

1
2
3
4
let a = 6 // 110
let b = 2
let c = a << b // 110 << 2 = 11000
print(c) // 24
>> (поразрядный сдвиг вправо)

Сдвигает биты первого операнда вправо на количество разрядов, заданное вторым операндом.

1
2
3
4
let a = 13 // 1101
let b = 2
let c = a >> b // 1101 >> 2 = 11
print(c) // 3
И также есть ряд операций, которые сочетают поразрядные операции с присваиванием:

&=: присвоение после поразрядной операции И.

Присваивает левому операнду результат поразрядной конъюнкции его битового представления с битовым представлением правого операнда: A &= B эквивалентно A = A & B

|=: присвоение после поразрядной операции ИЛИ.

Присваивает левому операнду результат поразрядной дизъюнкции его битового представления с битовым представлением правого операнда: A |= B эквивалентно A = A | B

^=: присваивание после операции исключающего ИЛИ.

Присваивает левому операнду результат операции исключающего ИЛИ его битового представления с битовым представлением правого операнда: A ^= B эквивалентно A = A ^ B.

<<=: присваивание после сдвига разрядов влево.

Присваивает левому операнду результат сдвига его битового представления влево на определенное количество разрядов, равное значению правого операнда: A <<= B эквивалентно A = A << B

>>=: присваивание после сдвига разрядов вправо.

Присваивает левому операнду результат сдвига его битового представления вправо на определенное количество разрядов, равное значению правого операнда: A >>= B эквивалентно A = A >> B.

Применение операций:

1
2
3
4
5
6
7
8
9
10
11
var a = 13 // 1101
a &= 5 // 1101 & 0101 = 0101
print(a) // 5
a |= 6 // 0101 | 0110 = 0111
print(a) // 7
a ^= 4 // 111 ^ 100 = 011
print(a) // 3
a <<= 3 // 11 << 3 = 11000
print(a) // 24
a >>= 1 // 11000 >> 1 = 1100
print(a) // 12