티스토리 뷰

728x90

기본연산자 외에 Swift에서는 더 복잡한 값을 조작할 수 있는 고급연산자를 제공합니다.

 


비트 연산자 (Bitwise Operators)

 

비트연산자를 사용하면 데이터 구조 내에서 개별 원시 데이터 비트를 조작할 수 있습니다.

그래픽 프로그래밍, 디바이스 드라이버 생성과 같은 Low-level 프로그래밍에 자주 사용됩니다.

 

Swift는 C에서의 모든 비트연산자를 지원합니다.

 

비트 NOT 연산자 (Bitwise NOT operator)

( ~ ) 키워드를 사용하여,  비트 값(2진수)을 반대로 바꿔줍니다. 

예시

let initialBits: UInt8 = 0b00001111 // 15
let invertedBits = ~initialBits // 240
// 1110000 (2진수) -> 240 (10진수)

 

 

비트 AND 연산자 (Bitwise AND operator)

 

( & ) 키워드를 사용하여, 두 숫자의 비트를 합칩니다.

입력된 숫자 위치가 둘다 1이면 1을 설정하는 새로운 숫자를 반환 합니다.

 

예시

let firstSixBits: UInt8 = 0b11111100 // 252
let lastSixBits: UInt8 =  0b00111111 // 63
let middleFourBits = firstSixBits & lastSixBits
// 00111100 (2진수) -> 60 (10진수)

 

 

비트 OR 연산자 (Bitwise OR operator)

( | ) 키워드를 사용하여, 두 숫자의 비트를 비교하고 하나라도 비트가 1이면 1을 설정하는 새로운 숫자를 반환 합니다.

예시

let someBits: UInt8 = 0b10110010
let moreBits: UInt8 = 0b01011110
let combinedbits = someBits | moreBits
// 11111110 -> 254

 

 

비트 XOR 연산자 (Bitwise XOR operator)

 

( ^ ) 키워드를 사용하여, 두 숫자의 비트가 같으면 0을, 다르면 1을 설정하는 새로운 숫자를 반환합니다.

 

예시

let firstBits: UInt8 = 0b00010100 // 20
let otherBits: UInt8 = 0b00000101 // 5
let outputBits = firstBits ^ otherBits
// 00010001 -> 17

 

 

비트 이동 연산자 (Bitwise Left and Right shift operator)

 

( << ) 와 ( >> ) 의 키워드를 사용하여, 왼쪽 또는 오른쪽으로 숫자의 모든 비트를 이동 시킵니다.

비트 왼쪽으로 이동 비트 오른쪽으로 이동
기존값 x2 기존값 ÷ 2

부호 없는 정수에서 비트 이동 동작 순서

  1. 기존 비트는 요청된 숫자만큼 왼쪽, 오른쪽으로 이동
  2. 정수의 저장소 범위를 넘어 이동된 비트는 삭제 
  3. 비트가 이동한 후 뒤에 남겨진 공백에는 0이 삽입

 

 

예시

let shiftBits: UInt8 = 4   // 00000100 in binary
shiftBits << 1             // 00001000 -> 8
shiftBits << 2             // 00010000 -> 16
shiftBits << 5             // 10000000 -> 128
shiftBits << 6             // 00000000 -> 0
shiftBits >> 2             // 00000001 -> 1

 

 

부호있는 정수에 대한 이동 동작  (Shifting Behavior for Signed Integers)

 

양수인지 음수인지 나타내기 위해 부호 비트(sign bit)로 알려진 첫번째 비트를 사용합니다.

값 비트(value bits)로 알려진 남아있는 비트는 실제 값을 저장합니다.

부호비트 
0 이면 양수
1 이면 음수를 나타냅니다.

 

위의 그림에서 부호비트는 0이므로 양수, 7개의 값 비트는 4를 나타냅니다.

-4를 표기하자면 아래와 같습니다.

 

부호 있는 정수에서 Shift

음수는 2의 보수로 나타냅니다.

  • 1의 보수 -> 전부 반전 후
  • 2의 보수 -> 1을 더합니다.
    ex) 4 = 00000100 
    -> 1의 보수        11111011
    -> 2의보수 (+1) 11111100 
    -> -4

2의보수를 사용하게되면 부호비트는 그냥 두고 나머지 자리로 이진 덧셈을 하고 int 크기를 벗어나는 것만 자르면 됩니다.

 

 

728x90

'iOS' 카테고리의 다른 글

[Combine] 개념  (0) 2022.10.13
[Swift] fatal Error  (4) 2022.09.25
[Swift] 접근제어 (Access Control)  (0) 2022.09.17
[iOS] Scroll top (스크롤바 최상단 이동)  (0) 2022.09.14
[Swift] 안전하게 배열 조회 (feat: indices)  (0) 2022.09.05