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

Operadores de Bit a Bit e Deslocamento Swift

Neste tutorial, você aprenderá diferentes operações bit a bit no Swift. Eles são usados para cálculos bit a bit em expressões.

Os bits são usados para representar números binários. Um número binário pode ter dois valores possíveis: 0 ou1Como programador iniciante, você não precisa usar operações a nível de bits.

Usando tipos de dados originais, como: integer, float, boolean, string, etc., é suficiente. Ao lidar com programação de nível inferior, você pode precisar trabalhar a nível de bits.

Além deOperações básicasAlém disso, o Swift oferece um conjunto rico de operadores para operar bits. Esses operadores são semelhantes aos operadores lógicos, mas eles tratam da representação binária dos dados (bits).

Os operadores de operação bit a bit são operadores usados para alterar os bits de um operando. O operando é a variável ou constante na qual a operação é executada.

A seguir está listado todos os operadores de operação bit a bit disponíveis no Swift:

1Operador lógico de negação bit a bit

É representado pelo símbolo de onda ~ e pode ser aplicado a um único operando. Isso invertirá todos os bits. Ou seja,1Altere para 0, altere 0 para1。

Se x for um valor binário armazenado (ou seja,1) variável/Se for uma constante, a operação lógica de negação do valor bit a bit da variável x pode ser representada na tabela a seguir:

Operação lógica de negação bit a bit
x~x
01
10

Exemplo1o operador de não-sinalizado de inteiros unsigned

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

Quando você executar o programa acima, a saída será:

254

let initalNumber:UInt8 = 1 No programa acima, a sentença let initalNumber:UInt8é do tipo Unsigned int, com tamanho de1bits. Portanto, o decimal1pode ser representado como 0000000

em binário.1e enquanto1o operador de não-sinalizado mudará todos os bits de um variável ou constante, e o bit 0 será mudado para11111110muda para 0. Portanto, o número invertido contém bits254depois de convertê-lo para decimal, ele representa254。

Portanto, a sentença print(invertedNumber) é exibida na tela

Exemplo2também pode executar operações bit a bit diretamente nos bits, conforme mostrado a seguir:

o operador de não-sinalizado de bits8 = 0b11111111
let initialBits: UInt  
let invertedBits = ~initialBits

Quando você executar o programa acima, a saída será:

0

print(invertedBits)11111111initialBits contém o valor binário255corresponde ao decimal8Para representar um número em binário, usamos 0b como prefixo no texto. Sem o prefixo 0b, ele o tratará como um inteiro normal e ocorrerá um erro de transbordamento (UInt255a

entre eles). Pode armazenar apenas números de1Devido ao uso do operador de não-sinalizado, todos os8todos eles mudam para 0. Portanto, o constante reverseBits contém 00000000, o que é equivalente a UInt

Exemplo3o operador de não-sinalizado de inteiros sinalizados

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

Quando você executar o programa acima, a saída será:

-2

No programa acima, o decimal1pode ser representado em binário como 00000001muda1que1muda para 0. Portanto, inverter o número inclui bits11111110deve ser exibido na tela254em vez de retornar-2。 Estranho, não? Vamos ver como isso acontece abaixo.

let initalNumber: Int = 1é um Inteiro Sinalizado, que pode conter tanto números inteiros positivos quanto negativos. Isso é por que, quando aplicamos um operador não-sinalizado a um inteiro sinalizado, o número binário retornado pode representar um número negativo.

como o compilador converte -2 explica11111110 em forma binária?

O compilador usa o código de complemento binário para representar inteiros. Para obter o sinal negativo do código de complemento binário de um número inteiro, você deve primeiro escrever o número em forma binária, inverter o número e, em seguida, adicionar 1.

pede-2os passos para obter o código de complemento binário de um número:

  1. escreve em forma binária2: 00000010

  2. inverte o número. 0 vira1e enquanto1para 0:11111101

  3. adiciona1: 11111110

Isso é o que o compilador converte em número binário1111110解释为十进制中的-2interpretado como decimal.8método. No entanto, o compilador tem um pequeno problema que não notamos. Ele também deduz o tipo invertedNumber como Int

tipo.

Para entender isso, vamos ver o exemplo a seguir:8print(Int11111110))
(bitPattern: 0b11111110)

Quando você executar o programa acima, a saída será:

-2
254

print(0b8No exemplo acima, o compilador considera apenas o tipo-2bits inteiro trata o número binário como decimal8。 Portanto, a instrução print(Int11111110)) é outputado na tela-2。

(bitPattern: 0b32/64Para254para11111110bits e pode conter tipos de inteiros comuns que podem armazenar valores maiores, ele interpreta o valor como254

2Portanto, a instrução print(0b

) é exibido1,então retorna1,no caso contrário retorna 0.

Se x e y são variáveis/Constantes, que salvam valores binários, ou seja, 0 ou1. Operador de AND bit a bit

Ele é representado por & e pode ser aplicado a dois operandos. O operador AND compara os bits, se os dois bits forem
xyOperação de AND
000
010
111
100

Exemplo5x & y

let xBits = 0b10000011
let yBits = 0b11111111
:Operação de AND bit a bit
let result = xBits & yBits 2))
print(result)

Quando você executar o programa acima, a saída será:

Binary: 10000011
131

print("Binary:", String(result, radix:1,então retorna1,no caso contrário retorna 0.

No programa acima, a instrução let result = xBits & yBits combina os bits dos dois operandos xBits e yBits. Se esses dois bits forem2String(value , radix: ) para inicializar o valor de diferentes sistemas de numeração. Se fornecermos o valor base16。 Ele converte o número para o sistema de números binário. Da mesma forma, podemos usar10representa hexadecimal, usando

A instrução print("Binary:",String(result, radix: 2)) é outputado na tela Binary:10000011。10000011representa decimal.131igual a decimal131。

3,a instrução print(result) é exibida no console

. Operador de OR bit a bit1Ele é representado por | e pode ser aplicado a dois operandos. Se um ou mais inputs do operador OR bit a bit forem1,compara os dois bits e gera o resultado

,caso contrário é 0.1) variável/Se x e y são mantidos nos valores binários (ou seja, 0 ou

Operação de OR
xyx | y
000
011
111
101

Exemplo6:Operação de OR bit a bit

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

Quando você executar o programa acima, a saída será:

Binary: 11111111
255

No programa acima, a instrução let result = xBits | yBits combina os bits dos dois constantes xBits e yBits. Se qualquer bit for1,então retorna1,no caso contrário retorna 0.

A instrução print("Binary:", String(result, radix: 2)) é exibido na telaBinary:11111111Porque11111111e255equivalente decimal, então a instrução print(result) é exibida na tela255

4. Operador de XOR bit a bit

Ele é representado por ^ e pode ser aplicado a dois operandos. O operador XOR compara os bits, se apenas um dos inputs é1então gera o resultado1,no caso contrário retorna 0.

Se x e y são variáveis/Constantes, que salvam valores binários, ou seja, 0 ou1A operação de exclusão lógica bit a bit de x e y pode ser representada na tabela a seguir:

Operação de exclusão lógica
xyx ^ y
000
011
110
101

Exemplo7:Operador de exclusão lógica bit a bit

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

Quando você executar o programa acima, a saída será:

Binary: 1111100
124

Na instrução let result = xBits ^ yBits do programa acima, a combinação de bits de dois constantes xBits e yBits.1,então retorna1,no caso contrário retorna 0.

A instrução print("Binary:",String(result, radix: 2)) é outputado na telaBinary:1111100(equivalente a 01111100). Devido a1111100equivalente124em decimal, portanto a instrução print(result) é outputada na tela124

5.Operadores de deslocamento

Este operador é usado para mover todos os bits de um número para a esquerda ou para a direita em uma quantidade específica e pode ser aplicado a um único operando. Ele é representado como << ou >>.

Existem dois operadores de deslocamento:

Operador de deslocamento à esquerda

  • Representado como <<

  • Isso causará o deslocamento de bits para a esquerda, especificado pelo número seguido por <<.

  • Os espaços deixados na operação de deslocamento são preenchidos com zeros.

  • Deslocar um bit de um inteiro para a esquerda dobrará seu valor

Exemplo8:Operador de deslocamento à esquerda

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

Quando você executar o programa acima, a saída será:

136

No programa acima, usamos o operador de deslocamento à esquerda. Usando <<1Representa o deslocamento de bits para a esquerda1Esses números se movem uma posição para a esquerda, e o último número da direita é preenchido com zero.

Você também pode ver que os bits deslocados da esquerda são perdidos. Eles não voltarão pela direita. Deslocando para a esquerda um bit remove-o do binário1e adiciona 0 à direita para preencher o valor de deslocamento, enquanto os outros bits restantes se movem para a esquerda1。

retorna10001000, equivalente a UInt8em136Portanto, print(someBits<<1) A sentença é exibida na tela136。

Operador de deslocamento à direita

  • Representado como >>

  • Isso causará o deslocamento de bits para a direita, seguido por >>

  • Para números inteiros sem sinal, os espaços deixados na operação de deslocamento são preenchidos com zeros.

  • Para números assinados (também podem ser números negativos), o bit de sinal é usado para preencher os espaços deixados.1。

  • Movendo uma posição para a direita, seu valor será reduzido pela metade.

Exemplo9Operador de deslocamento à direita de números inteiros sem sinal

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

Quando você executar o programa acima, a saída será:

2

No programa acima, usamos o operador de deslocamento à direita para inteiro sem sinal. Usando >>1significa mover os bits para a direita1。Os bits deslocados liberados para números sem sinal sempre são preenchidos com zeros.

Porque,4representado em binário como 00000100. Desloque um bit à direita, retornando 00000010equivalente a UInt8em2。Portanto, print(someBits>>1) A sentença é exibida na tela2。

Exemplo10:Operador de deslocamento à direita de número inteiro assinado

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

Quando você executar o programa acima, a saída será:

-2

No programa acima, usamos o operador de deslocamento à direita para inteiro sem sinal. Diferente dos números positivos, usamos >> para números negativos, usando1preenchidos com zeros, em vez de 0.

Porque,-4representado em binário como11111100. Desloque um bit à direita e1preenchidos com zeros, retornando11111110,equivalente a Int8do tipo-2。Portanto, print(someBits>>1A sentença ) é exibida na tela-2。