English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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:
É 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:
x | ~x |
---|---|
0 | 1 |
1 | 0 |
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
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
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:
escreve em forma binária2: 00000010
inverte o número. 0 vira1e enquanto1para 0:11111101
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。
) é 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
x | y | Operação de AND |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
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。
. 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
x | y | x | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
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。
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:
x | y | x ^ y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
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。
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:
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
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。
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.
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。
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。