English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Swift 고급
이 튜토리얼에서는 Swift의 다양한 비트 연산을 배울 것입니다. 이들은 표현式中의 비트 수준 계산에 사용됩니다.1비트는 이진 숫자를 표현하는 데 사용됩니다. 이진 숫자는 두 가지 가능한 값(0 또는
.비트 수준에서 연산을 사용하지 않아도 됩니다.
예를 들어, integer, float, boolean, string와 같은 원시 데이터 타입을 사용하면 충분합니다. 저级别 프로그래밍을 처리할 때는 비트 수준에서 작업이 필요할 수 있습니다.기본 연산또한 Swift는 비트를操作하는 다양한 연산자를 제공합니다. 이 연산자들은 논리 연산자와 유사하지만, 데이터(비트)의 이진 표현을 처리합니다.
비트 연산자는 연산자의 각 비트를 변경하는 연산자입니다. 연산자는 연산을 수행하는 변수나 상수입니다.
다음은 Swift에서 사용할 수 있는 모든 비트 연산자를 나열합니다:
波浪기호 ~로 표시되며, 단일 연산자에 적용할 수 있습니다. 이는 모든 비트를 반전합니다. 즉,10으로 변경되고, 0을 변경되고1。
x가 이진 값(즉 0 또는1)의 변수/정수형이면 x 변수의 비트 비교 연산은 다음 표에 나타낼 수 있습니다:
x | ~x |
---|---|
0 | 1 |
1 | 0 |
let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
위의 프로그램을 실행하면, 출력은 다음과 같습니다:
254
在上面的程序中,语句let initalNumber:UInt8 = 1 의 타입은 Unsigned int로, 크기는8비트.1로 나타낼 수 있습니다.1이진.
비트 비논리 연산자는 변수나 상수의 모든 비트를 변경하며, 비트 0을1그리고10으로 변경됩니다. 따라서 반전된 숫자는 비트11111110。 이를 십진수로 변환하면254。 따라서 문장 print(invertedNumber )는 화면에 출력됩니다254。
도 비트에서 직접 비트 연산자를 수행할 수 있습니다. 예를 들어:
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
위의 프로그램을 실행하면, 출력은 다음과 같습니다:
0
initialBits包含二进制值11111111,它对应于十进制255를 저장할 수 있습니다. 숫자를 이진 형태로 표현하려면 문자열에서 0b로 접두사를 사용해야 합니다. 0b가 없으면 일반 정수로 처리되며, 오버플로우 에러가 발생할 수 있습니다(UInt80부터255之间的数字)。
비트 비논리 연산자를 사용했기 때문에 모든1따라서 상수 reverseBits는 00000000를 포함하며, 이는 UInt와 동일합니다.8의 0을 모두 0으로 변경합니다.
let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
위의 프로그램을 실행하면, 출력은 다음과 같습니다:
-2
在上面的程序中,十进制的1로 이진 형태로 나타낼 수 있습니다.1비트 비논리 연산자는 변수나 상수의 모든 비트를 변경하며, 비트 0을1를 포함합니다.10으로 변경됩니다. 따라서 숫자를 반전시키는 것은 비트11111110이렇게 출력되어야 합니다.254이렇게 하지 않고-2。 이게 어리둥절하시죠? 아래에 어떻게 일어나는지 보겠습니다.
let initalNumber: Int = 1이는 부호가 있는 Int이며, 양수와 음수를 모두 포함할 수 있습니다. 따라서 부호가 있는 정수에 비논리 연산자를 적용할 때, 반환된 이진수는 음수를 나타낼 수도 있습니다.
컴파일러가 어떻게 -2 설명하면11111110 이진 형태?
컴파일러는 이진 부호 역전 코드로 정수를 표현합니다. 정수의 부호 역전 코드를 얻으려면 먼저 이진 형태로 숫자를 써야 하며, 그 다음 숫자를 반전시키고, 그 결과에 1을 더합니다.
구합니다.-2의 부호 역전 코드를 얻기 위해 필요한 단계는 다음과 같습니다:
이진 형태로 쓰입니다.2: 00000010
숫자를 반전시킵니다. 0은1그리고1되도록 변환합니다.11111101
추가1: 11111110
이것은 컴파일러가 이진수를1111110로 해석됩니다}}-2의 방식으로. 하지만 컴파일러에는 우리가 주의하지 않았던 작은 문제가 있습니다. 또한 invertedNumber의 타입을 Int로 추론합니다8형식으로
이해하기 위해 아래의 예제를 보겠습니다:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
위의 프로그램을 실행하면, 출력은 다음과 같습니다:
-2 254
위 예제에서 컴파일러는 부호 있는 정수 타입에만 대응합니다8비트 정수는 이진 수를 십진수로 처리합니다-2입니다. 따라서, print(Int8(bitPattern: 0b11111110))를 화면에 출력-2。
이면32/64비트이며 큰 값을 저장할 수 있는 일반 정수 타입에 들어갈 수 있습니다. 이 값은254입니다. 따라서, 화면에 print(0b11111110) 출력254。
그것은 &로 표시되며 두 연산자에 적용할 수 있습니다. AND 연산자는 두 비트를 비교하며, 두 비트가 모두1이 경우1이 경우 0을 반환
x와 y가 변수인 경우/상수, 이진 값을 저장하는 것입니다. 즉 0 또는1x와 y의 비트 AND 연산은 다음 표에서 나타낼 수 있습니다:
x | y | x & y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:", String(result, radix: 2)) print(result)
위의 프로그램을 실행하면, 출력은 다음과 같습니다:
이진: 10000011 131
위 프로그램에서 let result = xBits & yBits 문은 두 연산자 xBits와 yBits의 비트를 결합합니다. 이 두 비트가1이 경우1이 경우 0을 반환
를 제공하면2String(value , radix: ) 초기 값 설정자를 다른 진법에서 숫자를 표현하는 데 사용할 수 있습니다. 기본 값16로 표시됩니다. 숫자를 이진 수 시스템으로 변환합니다. 마찬가지로, 우리는10로 표시됩니다
이 문장 print("Binary:",String(result, radix: 2))를 화면에 출력 이진:10000011。10000011십진수와 동일합니다131이면, print(result) 문은 컨트롤台中 출력됩니다131。
그것은 |로 표시되며 두 연산자에 적용할 수 있습니다. 비트 이이퍼 연산자의 하나나 여러 입력이1비트를 비교하여 결과를 생성합니다1이면 0이 되며
x와 y가 이진 값(즉 0 또는1)의 변수/정수이면, x와 y의 비트 이이퍼 연산은 다음 표에서 나타낼 수 있습니다:
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)
위의 프로그램을 실행하면, 출력은 다음과 같습니다:
이진: 11111111 255
위 프로그램에서 let result = xBits | yBits 문은 두 상수 xBits와 yBits의 비트를 결합합니다. 어떤 비트가1이 경우1이 경우 0을 반환
이 문장 print("Binary:", String(result, radix: 2))를 화면에 출력합니다이진:11111111으로 인해11111111와255십진수와 동일하므로 print(result) 문은 화면에 출력됩니다255。
그것은 ^로 표시되며 두 연산자에 적용할 수 있습니다. 이이퍼运算자는 두 비트를 비교하며, 입력 중 하나만이1결과가 생성됩니다1이 경우 0을 반환
x와 y가 변수인 경우/상수, 이진 값을 저장하는 것입니다. 즉 0 또는1x와 y의 비트 배제 연산은 다음 표로 나타낼 수 있습니다:
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)
위의 프로그램을 실행하면, 출력은 다음과 같습니다:
이진: 1111100 124
위의 프로그램에서 let result = xBits ^ yBits 문은 두 상수 xBits와 yBits의 비트를 결합합니다. 그 중 하나의 비트가1이 경우1이 경우 0을 반환
이 문장 print("Binary:",String(result, radix: 2))를 화면에 출력이진:1111100(01111100)。다음과 같이1111100과 동일124십진수로 표현되며, 따라서 print(result) 문은 화면에 출력됩니다124。
이 연산자는 숫자의 모든 비트를 왼쪽이나 오른쪽으로 특정 위치로 이동시키기 위해 사용되며, 단일 연산자에 적용될 수 있습니다. << 또는 >>로 표현됩니다.
이동 연산자는 두 가지가 있습니다:
<<로 표현됩니다
비트가 왼쪽으로 이동되고, 이동된 비트는 << 뒤에 따릅니다.
이동 연산에서 비어 있는 비트 위치는 0으로 채웁니다.
정수의 비트를 왼쪽으로 이동하면 값이 두 배가 됩니다
let someBits:UInt8 = 0b11000100 print(someBits << 1)
위의 프로그램을 실행하면, 출력은 다음과 같습니다:
136
위의 프로그램에서는 왼쪽 이동 연산자를 사용했습니다. <<를 사용하여1비트를 왼쪽으로 이동하는 것을 나타냅니다1이진으로 표현됩니다
왼쪽 '끝'에서 이동된 비트가 복귀하지 않습니다. 그것을 한 위치 왼쪽으로 이동하면 이진에서 제거됩니다1우측에 0을 추가하여 이동 값을 채우고, 다른 비트의 나머지는 왼쪽으로 이동 위치로 이동1。
반환10001000, UInt8에서136따라서, print(someBits<<1) 문이 스크린에 출력됩니다136。
>>로 표현됩니다
비트가 오른쪽으로 이동되고, 이동된 비트는 >> 뒤에 따릅니다.
비호환 숫자의 비트 이동 연산에서 비어 있는 비트 위치는 0으로 채웁니다.
부호가 있는 숫자(음수로도 될 수 있습니다)의 경우, 부호 비트가 비어 있는 비트 위치를 채웁니다. 다시 말해, 숫자가 양수인 경우 0을 사용하며, 숫자가 음수인 경우1。
한 위치를 오른쪽으로 이동하면 값이 반으로 줄어듭니다.
let someBits: UInt8 = 4 print(someBits >> 1)
위의 프로그램을 실행하면, 출력은 다음과 같습니다:
2
위의 프로그램에서, 비시그널 정수에 대해 오른쪽 이동 연산자를 사용했습니다. >>를 사용하여1이는 비트를 오른쪽으로 이동하는 것을 의미합니다1。이동 연산자가 텅 빈 위치를 남겨두면, 무시된 정수는 항상 0으로 채워집니다.
그러나,4이진수로 표현되면 00000100을 오른쪽으로 이동하면, 000000을 반환10,UInt와 동일8에서2。따라서, print(someBits>>1) 문이 스크린에 출력됩니다2。
let someBits:Int = -4 print(someBits >> 1)
위의 프로그램을 실행하면, 출력은 다음과 같습니다:
-2
위의 프로그램에서, 비시그널 정수에 대해 오른쪽 이동 연산자를 사용했습니다. 정수와 달리, 음수는 >>를 사용하여 표현하고,1공백 위치를 0으로 채우지 않고, 0을 채우고
그러나,-4이진수로 표현되면11111100을 오른쪽으로 이동하면,1공백 위치에 배치되고, 0을 반환11111110,이는 Int8타입의-2。따라서, print(someBits>>1)문이 스크린에 출력됩니다-2。