Поразрядные операции

Последнее обновление: 04.04.2021

Поразрядные операции выполняются над отдельными разрядами или битами чисел. Данные операции производятся только над целыми числами.

Операции сдвига

Каждое целое число в памяти представлено в виде определенного количества разрядов. И операции сдвига позволяют сдвинуть битовое представление числа на несколько разрядов вправо или влево. Операции сдвига применяются только к целочисленным операндам. Есть две операции:

  • <<

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

  • >>

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

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

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. Поэтому получаем:

101
010
111

В итоге получаем число 111, что в десятичной записи представляет число 7.

Возьмем другое выражение 6 & 2. Число 6 в двоичной записи равно 110, а число 2 - 10 или 010. Умножим соответствующие разряды обоих чисел. Произведение обоих разрядов равно 1, если оба этих разряда равны 1. Иначе произведение равно 0. Поэтому получаем:

110
010
010

Получаем число 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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850