다른 연산자보다 어렵기 때문에 잘사용되지 않는다.
하지만 메모리에 실제 저장된 값을 계산하기 떄문에 처리 속도가 빠르고
짧은 코드로 복잡한 로직을 구현할떄 자주 활용된다.
비트에는 0과 1을 저장할수 있는데 논리 연산자와 비슷하다.
~a
bit를 0을 1로 1을 0으로 바꿔준다.
let a : UInt8 = 0b0000_0010
~a // 0b1111_1101
a & b
let a : UInt8 = 0b0010_0010
let b : UInt8 = 0b1100_1110
a & b // ob0000_0010
하나라도 0이라면 최종비트는 0 이되고 모두 1일때만 1이 된다.
let a : UInt8 = 0b0010_0010
let b : UInt8 = 0b1100_1110
a | b // 0b1110_1110
// 하나라도 1이라면 최종비트는 1 이되고 모두 0일떄민 10이 된다.let a : UInt8 = 0b0010_0010
let b2 : UInt8 = 0b1100_1110
a & b2 // ob0000_0010
// 하나라도 0이라면 최종비트는 0 이되고 모두 1일떄민 1이 된다.
a ^ b
두 비트가 다를때만 1이되고 두피트가 같을떄는 0
let a : UInt8 = 0b0010_0010
let b : UInt8 = 0b1100_1110
a | b // 0b1110_1100
Bitwise Left Shift Operator
a << n
메모리의 저장된 비트를 왼쪽으로 이동시킨다. 맨앞의 비트는 사라지고 새로 추가된 비트에는 0이 저장된다.
let a : UInt8 = 0b0010_0010
a << 1 // ob0100_0100 *2와 동일
a << 2 // ob1000_1000 *4와 동일
a * 4 // 위와 동일하지만 위에 연산자가 더빠르게 실행된다.
a >> n
비트가 오른쪽으로 밀려나고 밀려난 비트는 사라제기 된다. 새롭게 추가된 비트는 0일수도 있고 아닐수도있다.
기존에 있던 sign bit가 채워진다. 만약 맨앞이 0이였다면 0 앞이 1이였다면 1로 채워친다.
let a : UInt8 = 0b0010_0010 //34
a >> 1 // / 2와 동일 // 17
a >> 2 // / 4와 동일 // 8