Development/Swift

[Swift]Swift가 제공하는 연산자들 - Operators in Swift (2)

morijwana 2020. 7. 15. 14:30

비트 연산자 - Bitwise Operators

비트 단위로 연산하는 연산자. 첫 번째 비트를 부호 비트로 사용하는 signed type의 자료형은 비트 연산에 주의해야 한다.

  • 비트 NOT 연산자 - Bitwise NOT Operator 👉 ~a
value1 ~value1
0 1
1 0
// unsigned int8
let a : UInt8 = 0b0101_1011   // 91 (0101 1011)
let b : UInt8 = ~a            // 164(1010 0100)
// signed int8
let c : Int8 = 0b0101_1011    // 91 (0101 1011)
let d : Int8 = ~c             // -92(1010 0100)

 

  • 비트 AND 연산자 - Bitwise AND Operator 👉 a & b
    두 비트 모두 1이어야 1, 아니면 0이다.
value1 value2 value1 & value2
0 0 0
0 1 0
1 0 0
1 1 1
let a : UInt8 = 0b0101_1011    // 91(0101 1011)
let b : UInt8 = 0b0010_0001    // 33(0010 0001)
let val2 = a & b               // 1 (0000 0001)

 

  • 비트 OR 연산자 - Bitwise OR Operator 👉 a | b
    두 비트중에 하나라도 1이면 1, 둘 다 0이면 0이다.
value1 value2 value1 | value2
0 0 0
0 1 1
1 0 1
1 1 1
let a : UInt8 = 0b0101_1011    // 91 (0101 1011)
let b : UInt8 = 0b0010_0001    // 33 (0010 0001)
let val2 = a | b               // 123(0111 1011)

 

  • 비트 XOR 연산자 - Bitwise OR Operator 👉 a ^ b
    두 비트의 값이 달라야 1이고, 값이 같으면 0이다.
value1 value2 value1 ^ value2
0 0 0
0 1 1
1 0 1
1 1 0
let a : UInt8 = 0b0101_1011    // 91 (0101 1011)
let b : UInt8 = 0b0010_0001    // 33 (0010 0001)
let val2 = a ^ b               // 122(0111 1010)

 

  • 비트 왼쪽 시프트 연산자 - Bitwise Left Shift Operator 👉 a << n
    비트를 왼쪽으로 n칸씩 이동시키고, 오른쪽의 빈 비트를 0으로 채운다. signed의 경우 부호 변화에 주의해야 한다. a << n의 값은 a * 2^n^의 값과 같다.
// unsigned int8
let a : UInt8 = 0b0101_1011    // 91 (0101 1011)
let b = a << 1                 // 182(1011 0110)
// signed int8
let c : Int8 = 0b0101_1011     // 91 (0101 1011)
let d = a << 1                 // -74(1011 0110)

 

  • 비트 오른쪽 시프트 연산자 - Bitwise Left Shift Operator 👉 a >> n
    비트를 오른쪽으로 n칸씩 이동시키고, 왼쪽의 빈 비트를 unsigned의 경우 0으로 채우며(논리적 시프트 Logical Shift) signed의 경우 부호 비트로 채운다(양수인 경우 0, 음수인 경우 1 - 산술 시프트 Arithmetic Shift). a >> n의 값은 a / 2^n^의 값과 같다.
// unsigned int8
let a : UInt8 = 0b0101_1011    // 91 (0101 1011)
let b = a >> 1                 // 182(1011 0110)
// signed int8
let c : Int8 = 0b0101_1011     // 91 (0101 1011)
let d = ~c                     // -92(1010 0100)
let e = d >> 1                 // -46(1101 0010)

 

할당 연산자 - Assignment Operators

값을 저장하는 데 사용되는 연산자이다.

할당 연산자 설명 사용 예시
= b의 값을 a에 저장. ==와 헷갈리지 말자. a = b
+= a + b의 값을 a에 저장 a += b
-= a - b의 값을 a에 저장 a -= b
*= a * b의 값을 a에 저장 a *= b
/= a / b의 값을 a에 저장 a == b
%= a % b의 값을 a에 저장 a %= b
&= a & b의 값을 a에 저장 a &= b
|= a | b의 값을 a에 저장 a |= b
<<= a << b의 값을 a에 저장 a <<= b
>>= a >> b의 값을 a에 저장 a >>= b

할당한 값을 리턴하는 Objective-C의 할당문과는 다르게 Swift의 할당문은 어떠한 값도 리턴하지 않는다.

 

범위 연산자 - Range Operators

Swift에서 범위를 표현하는 방식이다.

  • 닫힌 구간 범위 연산자 - Closed range Operator 👉 a...b, a..., ...a
    👉 a...b = [a, b]
    닫힌 구간 범위 연산은 upperBound와 lowerBound의 값을 포함한다. 또한, lowerBound의 값이 upperBound의 값보다 클 수 없다.(10...1 불가능) > 내림차순 범위가 필요하다면 `reversed()` 메소드를 사용하면 된다. ```swift (1...10).reversed() // 10, 9, ..., 2, 1 ```
var sum = 0
for num in 1...10 {
  sum += num
}
// sum = 55

let list = ["A", "B", "C", "D", "E"]
list[2...]  // ["C", "D", "E"]
list[...2]  // ["A", "B", "C"]

 

  • 반 열린 구간 범위 연산자 - Half-Open range Operator 👉 a..<b, ..<a
    👉 a...b = [a, b)
    Python의 `range()`처럼 upperBound는 포함하지만 lowerBound는 포함하지 않는다. 다만 오른쪽 끝의 경계를 꼭 명시해야 한다.
var sum = 0
for num in 1..<10 {
  sum += num
}
// sum = 45

let list = ["A", "B", "C", "D", "E"]
list[..<2]  // ["A", "B"]