English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift базовый курс

Операторы Swift

Swift управление потоком

Swift коллекции

Swift функции

Swift продвинутый

Битовые и位移 операторы Swift

В этом руководстве вы узнаете о различных битовых операциях в Swift. Они используются для вычислений на уровне бит в выражениях.

Биты используются для представления двоичных чисел. Двоичное число может иметь два возможных значения 0 или 1. В качестве начинающего программиста вам не нужно работать на уровне бит.

Использование исходных данных типов, таких как: integer, float, boolean, string и т.д., достаточно для обработки низкоуровневой программирования. При обработке низкоуровневого программирования может потребоваться работа на уровне бит.

КромеОсновные операцииКроме того, Swift предоставляет набор богатых операторов для работы с битами. Эти операторы подобны логическим операторам, но они обрабатывают двоичное представление данных.

Битовые операторы используются для изменения отдельных бит операнда. Операнд - это переменная или константа, в которой выполняется операция.

Ниже приведены все битовые операторы, доступные в Swift:

1. Оператор несовместимости

Он представлен символом ~ и может применяться к одному операнду. Это изменяет все биты, т.е. меняет 1 на 0, а 0 на 1.

Если x - это переменная или константа, сохраняющая двоичное значение (т.е. 0 или 1), то битовая несовместимость переменной x может быть представлена в таблице ниже:

Битовая несовместимость
x~x
01
10

Пример 1: битовый оператор несовместимости для беззнаковых целых чисел

let initalNumber: UInt8 = 1 
let invertedNumber = ~initalNumber 
print(invertedNumber)

Когда вы запустите вышеуказанную программу, вывод будет:

254

В上面的 программе переменная let initalNumber:UInt8 = 1 имеет тип Unsigned int, размером в 8 бит. Таким образом, десятичное значение 1 можно представить в двоичном формате как 00000001.

Оператор несовместимости изменяет все биты переменной или константы, бит 0 изменяется на 1, а 1 на 0. Таким образом, обратное число содержит биты 11111110. Преобразовав его в десятичное значение, оно равно 254. Таким образом, команда print(invertedNumber) выводит на экран 254.

Битовые операции также可以直接 выполняться в битах, как показано ниже:

Пример 2: битовый оператор несовместимости

let initialBits: UInt8 = 0b11111111
let invertedBits = ~initialBits  
print(invertedBits)

Когда вы запустите вышеуказанную программу, вывод будет:

0

Пакет initialBits содержит двоичное значение 11111111, что соответствует десятичному 255. Чтобы представить цифру в двоичном формате, мы используем префикс 0b в тексте. Если префикс 0b отсутствует, он будет рассматривать это как обычное целое число, и может возникнуть ошибка переполнения (UInt8 может хранить только числа от 0 до 255).

由于我们使用了按位非运算符,因此将所有1都更改为0。因此,常量reverseBits包含00000000,这等效于UInt8中的0。

示例3:有符号整数的按位非运算符

let initalNumber: Int = 1 
let invertedNumber = ~initalNumber 
print(invertedNumber)

Когда вы запустите вышеуказанную программу, вывод будет:

-2

在上面的程序中,十进制的1可以二进制表示为00000001。 按位非运算符将更改变量或常量的所有位,将位0更改为1,将1更改为0。因此,反转数字包含位11111110。这应在屏幕中输出254。 而是返回-2。 奇怪吧? 让我们在下面看看这是如何发生的。

let initalNumber: Int = 1是一个有符号 Int,可以同时包含正整数和负整数。这就是为什么当我们对有符号整数应用非运算符时,返回的二进制数也可能表示负数。

编译器如何将 -2 解释 为11111110 二进制形式?

编译器使用二进制补码表示整数。 要获得整数的二进制补码负号,您应该首先以二进制形式写出数字,然后将数字取反,然后在结果中加一个。

求-2的补码的步骤:

  1. 以二进制形式写2: 00000010

  2. 反转数字。0变为1,而1变为0:11111101

  3. 加1: 11111110

这就是编译器将二进制数1111110解释为十进制中的-2的方式。 但是,编译器有一个我们没有注意到的小问题。 它还推断 invertedNumber 的类型为Int8类型。

为了理解这一点,让我们看下面的实例:

print(Int8(bitPattern: 0b11111110))
print(0b11111110)

Когда вы запустите вышеуказанную программу, вывод будет:

-2
254

在上面的示例中,编译器仅对带符号的8位整数将二进制数处理为十进制的-2。因此,语句print(Int8(bitPattern: 0b11111110))在屏幕上输出-2。

但是对于大小为32/64位并且可以容纳较大值的普通整数类型,它将值解释为254。因此,语句在屏幕上print(0b11111110)输出254

2. Оператор битовое И

Это обозначается символом & и может применяться к двум операндам. Оператор AND сравнивает два бита, и если оба бита равны 1, то результат равен 1, в противном случае 0.

Если x и y являются переменными/константами, сохраняющими двоичное значение (то есть 0 или 1), то битовое И x и y можно представить в таблице ниже:

Битовое И
xyx & y
000
010
111
100

Пример 5: Операция битовое И

let xBits = 0b10000011
let yBits = 0b11111111
let result = xBits & yBits
print("Бинарное:", String(result, radix: 2))
print(result)

Когда вы запустите вышеуказанную программу, вывод будет:

Бинарное: 10000011
131

В上面的 программе команда let result = xBits & yBits комбинирует биты двух операндов xBits и yBits. Если оба бита равны 1, то результат равен 1, в противном случае 0.

Initial value for String(value, radix:) используется для представления чисел в различных системах счисления. Если мы предоставляем базовое значение 2, оно преобразует число в двоичную систему счисления. Таким же образом, мы можем использовать 16 для шестнадцатеричной системы счисления и 10 для десятичной.

Эта команда print("Binary:", String(result, radix: 2)) выводит на экран Бинарное:10000011. 10000011 равно 131 в десятичной системе, команда print(result) выводит в консоли 131.

3. Оператор битовое И

Это обозначается символом | и может применяться к двум операндам. Если один или несколько входов оператора битовое И равны 1, то сравниваются два бита и результат равен 1, в противном случае 0.

Если x и y являются переменными/константами, сохраняющими двоичное значение (то есть 0 или 1), то битовое И x и y можно представить в таблице ниже:

Операция битовое И
xyx | y
000
011
111
101

Пример 6: Операция битовое И

let xBits = 0b10000011
let yBits = 0b11111111
let result = xBits | yBits
print("Binary:", String(result, radix: 2))
print(result)

Когда вы запустите вышеуказанную программу, вывод будет:

Бинарное: 11111111
255

В上面的 программе команда let result = xBits | yBits комбинирует биты двух констант xBits и yBits. Если любой бит равен 1, то результат равен 1, в противном случае 0.

Эта команда print("Бинарное:", String(result, radix: 2)) выводит на экран:Бинарное: 11111111. Так как 11111111 эквивалентен 255 в десятичной системе, поэтому команда print(result) выводит на экран:255

4. Оператор битовое ИЛИ

Это обозначается символом ^ и может применяться к двум операндам. Оператор битовое ИЛИ сравнивает два бита, и если только один из них равен 1, то результат равен 1, в противном случае 0.

Если x и y являются переменными/константами, сохраняющими двоичное значение, то есть 0 или 1, битовое ИЛИ x и y можно представить в таблице ниже:

Операция битовое ИЛИ
xyx ^ y
000
011
110
101

Пример 7: Операция битовое ИЛИ

let xBits = 0b10000011
let yBits = 0b11111111
let result = xBits ^ yBits
print("Binary:", String(result, radix: 2))
print(result)

Когда вы запустите вышеуказанную программу, вывод будет:

Binary: 1111100
124

В предыдущем примере команда let result = xBits ^ yBits объединяет биты двух констант xBits и yBits. Если один из бит точно равен 1, то возвращается 1, в противном случае 0.

Эта команда print("Binary:", String(result, radix: 2)) выводит на экранBinary: 1111100(эквивалентно 01111100). Поскольку 1111100 эквивалентен 124 в десятичной системе, команда print(result) выводит на экран124

5. Оператор смещения

Этот оператор используется для смещения всех бит числа на определенное количество позиций влево или вправо и может применяться к одному операнду. Он представлен << или >>.

Смещение операторов有两种:

Битовский оператор левого смещения

  • 表示为 <<

  • Это вызывает левое смещение битов, которое указывается числом после <<

  • Освободившиеся позиции смещения заполнены нулями.

  • Смещение битов левого типа удваивает значение числа

Пример 8: оператор битовского левого смещения

let someBits:UInt8 = 0b11000100
print(someBits << 1)

Когда вы запустите вышеуказанную программу, вывод будет:

136

В предыдущем примере мы использовали оператор левого смещения. Использование <<1 означает смещение битов на один бит влево. Эти числа смещаются на один бит влево, и ноль добавляется справа.

Вы также можете видеть, что цифры, смещенные с левой "стороны", теряются. Они не возвращаются обратно справа. Смещение на один бит влево удаляет 1 из двоичного числа, добавляет 0 справа для заполнения смещенного значения, а другие биты смещаются на один бит влево.

Возвращает 10001000, что эквивалентно 136 в UInt8. Поэтому строка print(someBits << 1) выводит на экран 136.

Битовский оператор правого смещения

  • 表示为 >>

  • Это вызывает правое смещение битов, за которым следует >>

  • Для беззнаковых чисел освободившиеся битовые позиции заполнены нулями.

  • Для знаковых чисел (также может быть отрицательным), бит знака используется для заполнения освободившихся битовых позиций. Иными словами, если число положительное, используется 0; если отрицательное, используется 1.

  • Перемещение на один бит вправо удваивает его значение.

Пример 9: оператор битовского右移

let someBits: UInt8 = 4     
print(someBits >> 1)

Когда вы запустите вышеуказанную программу, вывод будет:

2

В вышеуказанной программе мы используем правое смещение для беззнаковых целых чисел. >>1 означает смещение битов вправо на один. Пустые места, оставленные смещением, для беззнаковых целых чисел всегда заполнены нулями.

Потому что, 4 в двоичном представлении равно 00000100. При правом смещении на один бит, вернёмся к 00000010, что равно 2 в UInt8. Поэтому, предложение print(someBits>>1) выводит на экран 2.

Пример 10: Битовое правое смещение для знаковых целых чисел

let someBits: Int = -4     
print(someBits >> 1)

Когда вы запустите вышеуказанную программу, вывод будет:

-2

В上面的 программе мы используем правое смещение для беззнаковых целых чисел. В отличии от положительных чисел, >> для отрицательных чисел означает заполнение пустых мест 1, а не 0.

Потому что, -4 в двоичном представлении равно 11111100. Поставьте 1 в пустое место при правом смещении на один бит, вернёмся к 11111110, что равно -2 типа Int8. Поэтому, предложение print(someBits>>1) выводит на экран -2.