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

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

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

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

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

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

    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.

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

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

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

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

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

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

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

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

    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.

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

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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850