Поразрядные операции выполняются над отдельными разрядами или битами чисел. Данные операции производятся только над целыми числами.
Каждое целое число в памяти представлено в виде определенного количества разрядов. И операции сдвига позволяют сдвинуть битовое представление числа на несколько разрядов вправо или влево. Операции сдвига применяются только к целочисленным операндам. Есть две операции:
<<
Сдвигает двоичное представление числа, представленного первым операндом, влево на определенное количество разрядов, которое задается вторым операндом.
>>
Сдвигает двоичное представление числа вправо на определенное количество разрядов.
Применение операций:
let a = 2 << 2; // 10 на два разрядов влево = 1000 - 8 let b = 16 >> 3; // 10000 на три разряда вправо = 10 - 2
Число 2 в двоичном представлении 10. Если сдвинуть число 10 на два разряда влево, то получится 1000, что в десятичной системе равно число 8.
Число 16 в двоичном представлении 10000. Если сдвинуть число 10 на три разряда вправо (три последних разряда отбрасываются), то получится 10, что в десятичной системе представляет число 2.
Для более наглядного представления еще можно использовать двоичный формат чисел:
let a = 0b0010 << 2; let b = 0b10000 >> 3; println!("a = {} b= {}", a, b);
Еще два оператора сочетают операции присваивания и сдвига:
<<=
Присваивание после сдвига разрядов влево. Присваивает левому операнду результат сдвига его битового представления влево на определенное количество разрядов, равное значению правого операнда: A <<= B эквивалентно A = A << B
>>=
Присваивание после сдвига разрядов вправо. Присваивает левому операнду результат сдвига его битового представления вправо на определенное количество разрядов, равное значению правого операнда: A >>= B эквивалентно A = A >> B
Примеры операций:
fn main(){ let mut x = 8; println!("x = {}", x); x <<= 2; // 8 в двоичной системе 1000, // после сдвига на 2 разряда вправо 10000 или 32 в десятичной системе println!("x = {}", x); // 32 x >>= 3; // 32 в двоичной системе 100000, // после сдвига на 3 разряда вправо 100 или 4 в десятичной системе println!("x = {}", x); // 4 }
Поразрядные логические операции также проводятся только над соответствующими разрядами целочисленных операндов:
&: поразрядная конъюнкция (операция И или поразрядное умножение). Возвращает 1, если оба из соответствующих разрядов обоих чисел равны 1
|: поразрядная дизъюнкция (операция ИЛИ или поразрядное сложение). Возвращает 1, если хотя бы один из соответствующих разрядов обоих чисел равен 1
^: поразрядное исключающее ИЛИ. Возвращает 1, если только один из соответствующих разрядов обоих чисел равен 1
Применение операций:
let a = 5 | 2; // 101 | 010 = 111 - 7 let b = 6 & 2; // 110 & 010 = 10 - 2 let c = 5 ^ 2; // 101 ^ 010 = 111 - 7
Например, выражение 5 | 2
равно 7. Число 5 в двоичной записи равно 101, а число 2 - 10 или 010. Сложим соответствующие разряды обоих чисел. При сложении если хотя бы
один разряд равен 1, то сумма обоих разрядов равна 1. Поэтому получаем:
1 | 0 | 1 |
0 | 1 | 0 |
1 | 1 | 1 |
В итоге получаем число 111, что в десятичной записи представляет число 7.
Возьмем другое выражение 6 & 2
. Число 6 в двоичной записи равно 110, а число 2 - 10 или 010. Умножим соответствующие разряды
обоих чисел. Произведение обоих разрядов равно 1, если оба этих разряда равны 1. Иначе произведение равно 0. Поэтому получаем:
1 | 1 | 0 |
0 | 1 | 0 |
0 | 1 | 0 |
Получаем число 010, что в десятичной системе равно 2.
Опять же для большей наглядности можно использовать двоичный формат чисел:
let a = 0b101 | 0b010; let b = 0b110 & 0b010; let c = 0b101 ^ 0b010;
Еще ряд операций объединяет поразрядные логические операции и операции присваивания:
&=: присваивание после поразрядной конъюнкции. Присваивает левому операнду результат поразрядной конъюнкции его битового представления с двоичным представлением правого операнда: A &= B эквивалентно A = A & B
|=: присваивание после поразрядной дизъюнкции. Присваивает левому операнду результат поразрядной дизъюнкции его битового представления с двоичным представлением правого операнда: A |= B эквивалентно A = A | B
^=: присваивание после операции исключающего ИЛИ. Присваивает левому операнду результат операции исключающего ИЛИ его битового представления с двоичным представлением правого операнда: A ^= B эквивалентно A = A ^ B