Swift - 고급() 연산자
고급(비트) 연산자를 이해하기에 앞서 먼저 Int, UInt를 선행 학습하시기를 권장해 드립니다.
정수값을 저장하기 위해 사용되는 변수 타입 : Int & UIint
Int -> -, + 부호 모두 저장 가능한 변수 타입
UInt -> + (양)의 부호만 저장 가능한 변수 타입
자 여기에서 Int8, UInt8 ...Int64, Int64 이렇게 뒤에 Int[숫자]가 들어가는데
이건 변수에 저장가능한 용량!?을 표현하는거에요.
8비트, 16비트, 32비트, 64비트 이렇게요.
비트가 적을 수록 저장할 수 있는 용량이 작아 지겠조?
#아래와 같이 저장 사이즈가 차이가 있습니다.
Int8 -> -128 ~ 127 .... Int64 -> 0 ~ 18446744073709551615
UInt8 -> 0 ~ 255 ..... UInt64 -> -9223372036854775808 ~ 9223372036854775807
자 상세한 내용은 스위프트 공식 가이드 문서 또는 XCode에서 확인해주세요.
print("Int8 = \(Int8.min) ~ \(Int8.max)")
print("Int64 = \(Int64.min) ~ \(Int64.max)")
print("Unt8 = \(UInt8.min) ~ \(UInt8.max)")
print("Unt64 = \(UInt64.min) ~ \(UInt64.max)")
고급(비트) 연산자에 대한 상세한 설명은 링크를 참조 드릴게요.
저도 아직 공부중이라 정확한 내용이 아닐 수 있으니 참고만 부탁드려요.
비트연산은 2진수로 연산이 가능합니다.
ex ) int = 1 -> 0b00000001
비트 연산자 NOT (Bitwise NOT Operator) - [ ~ ]
여집합!!
2진수로 initialBits의 값이 0000 1111 일 경우
-> ~initialBits진행하면 값은 1111 0000으로 변환이 됩니다.
let initialBits: UInt8 = 0b00001111
let invertedBits = ~initialBits // equals 11110000
print("~initialBits : \(String(invertedBits, radix: 2))")
비트 연산자 AND (Bitwise AND Operator) - [ & ]
교집합!!
1111 1100 & 0011 1111 이렇게 두값을 연산하면
1 1 1 1 1 1 0 0
001 1 1 1 1 1
-> 0011 1100 으로 값이 변환 됩니다.
let firstSixBits: UInt8 = 0b11111100
let lastSixBits: UInt8 = 0b00111111
let middleFourBits: UInt8 = firstSixBits & lastSixBits // equals 00111100
print("firstSixBits & lastSixBits : \(String(middleFourBits, radix: 2))")
비트 연산자 OR (Bitwise OR Operator) - [ | ]
합집합!!
네 두값을 비교하였을 경우 1의 값이 하나라도 위치한다면 반환되는 값은 1로 반환이 됩니다.
let someBits: UInt8 = 0b10110010
let moreBits: UInt8 = 0b01011110
let combinedbits = someBits | moreBits // equals 11111110
print("someBits | moreBits : \(String(combinedbits, radix: 2))")
비트 연산자 XOR (Bitwise XOR Operator) - [ ^ ]
합집합 - 교집합
이 연산자는 위의 or연산자를 진행하고 반환되는 값에 반대의 값이 반환됩니다.
let firstBits: UInt8 = 0b00010100
let otherBits: UInt8 = 0b00000101
let outputBits = firstBits ^ otherBits // equals 00010001
print("firstBits ^ otherBits : \(String(outputBits, radix: 2))")
비트 시프트 연산자 (Bitwise Left and Right Shift Operators) - [ >> ]
비트 단위 이동
0000 0001 << 1
--> 0000 0010)
이값은 비트단위의 값을 >>1 이렇게 진행하면 화살표 방향으로 숫자를 이동시키며 이동시켰을경우
그 반대방향의 끝 값은 0으로 값이 변경됩니다.
또한 >> 16 등을 사용하면 형변환도 됩니다.
let shiftBits: UInt8 = 4 // 00000100 in binary
shiftBits << 1 // 00001000
shiftBits << 2 // 00010000
shiftBits << 5 // 10000000
shiftBits << 6 // 00000000
shiftBits >> 2 // 00000001
let pink: UInt32 = 0xCC6699
let redComponent = (pink & 0xFF0000) >> 16 // redComponent is 0xCC, or 204
let greenComponent = (pink & 0x00FF00) >> 8 // greenComponent is 0x66, or 102
let blueComponent = pink & 0x0000FF // blueComponent is 0x99, or 153