== 연산자와 ===연산자의 차이점은 이전 포스트 참고!
비트 연산자는 기계가 이해할 수 있는 값인 0과 1을 처리하는 데 사용한다. 비트 연산자는 프로그래머가 기기를 직접 제어해야 하는 경우 아주 유용하게 사용된다. 보통 IoT 기기를 위한 컨트롤러를 접근하거나 프로세서의 레지스터에 접근하는 임베디드 시스템 프로그래밍 분야에서 비트 연산을 사용하는 경우가 많다고 한다.
우리가 사용하는 10진법은 인간에게 유리한 수의 체계지만, 컴퓨터의 연산을 위해서는 0과 1로 이루어진 2진법 체계가 유리하다. 다만, 2진법은 사람이 읽고 쓰기 힘들기 때문에 코드 상에서는 주로 2진법의 4비트 대신 16진법 1비트로 표현한다.
0100 👉 4
1011 👉 -5 (4의 inverse)
why?
0101 (-5의 절댓값)
1010 (1의 보수)
1011 (2의 보수) 👉 이게 바로 십진수로 -5
package chap02.section4
fun main() {
val x = 10 // 0000_1010(2)
println("x shl 2 -> ${x.shl(2)}") // 0010_1000 -> 40
println("x shr 2 -> ${x.shr(2)}") // 0000_0010 -> 2
println("x ushr 2 -> ${x.ushr(2)}") // 0000_0010 -> 2
val y = 5 // 0000_0101(2)
// 0101 && 0111 -> 0101 -> 5
println("y and 2 -> ${y.and(7)}")
// 0101 || 0111 -> 0111 -> 7
println("y or 2 -> ${y.or(7)}")
// 0101 xor 0111 -> 0010 -> 2
println("y xor 2 -> ${y.xor(7)}")
// 0101 -> 5
// 1010 -> -6
// 0110 (-6의 절댓값)
// 1001 (1의 보수)
// 1010 (2의 보수) -> 이게 바로 십진수로 -6
println("y inv -> ${y.inv()}")
}
x shl 2 -> 40
x shr 2 -> 2
x ushr 2 -> 2
y and 2 -> 5
y or 2 -> 7
y xor 2 -> 2
y inv -> -6