이번 글에서는 코틀린의 비트 연산자(Bitwise Operator)를 사용해서 비트 연산을 해보고 결과를 확인해 보도록 하겠습니다. 😁
예제 코드
fun main(args:Array<String>):Unit
{
println(15 and 7)
println(5 or 2)
println(15 xor 5)
println(32767.inv())
println(1 shl 3)
println(8 shr 1)
println(-17 ushr 2)
}
//결과
7
7
10
-32768
8
4
1073741819
Process finished with exit code 0
우선 코드와 결과만 보고 한 번 추측을 해봅시다.
15의 경우 비트로 2진수로 나타내면 1111, 7의 경우 2진수로 나타내면 0111입니다. 그렇기 때문에 and 연산을 할 경우 둘 다 1인 비트만 남게 되어 0111 즉, 7이 됩니다. 🧀
마찬가지로 or의 경우입니다. 5의 경우에는 0101, 2의 경우 0010 이 두 비트를 or 연산할 경우 0111 즉, 7입니다.
다음으로 xor 연산입니다. 1111, 0101을 xor 연산할 경우 1010 즉 10이 됩니다.
inv() 같은 경우에는 비트를 반전시키는 연산 같습니다.
32,767은 2진수로 나타내면 0111 1111 1111 1111입니다. 🍗
이때 해당 숫자에 NOT 연산을 해주게 되면?
이와 같이 -32,768이 되는 것을 확인할 수 있습니다. 아니 왜 이렇게 되는 걸까요?
사실 1000 0000 0000 0000 은 10진수로 32,768입니다. 즉 0111 1111 1111 1111을 반전시키면 32,768이 될 것 같지만, 하지만 부호 비트의 경우에도 적용이 되어 음수(마이너스)가 되는 것입니다. 🍷
다음은 shl입니다. 시프트 연산입니다.
10진수 1을 왼쪽으로 3번 시프트 할 경우 2진수 1000이 되어 10진수로 8이 되죠. 여기서 알 수 있는 것은 shl은 shift LEFT가 된다는 것이겠네요.
이에 shr은 shift RIGHT라는 것을 쉽게 유추할 수 있습니다. 즉 8 shr 1 은 0100, 즉 10진수 4가 되는 것입니다.
-17의 경우 2진수로 위와 같습니다. (1111... 1110 1111) 그리고 1073741819의 경우 2진수로 (0011.... 1111 1011)입니다. 즉 ushr의 경우는 unsigned(?) shift right 인 것 같습니다. 즉 시프트를 하되 밀리는 비트의 경우 0으로 채워주는 것 같습니다. 그래서 결과가 위와 같이 나온 것 이겠죠. 🍑
마무리
and, or, xor의 경우 이해하는 데는 무리가 없었을 것이라고 생각합니다. inv의 경우 자바에서 ~연산자로 비트 반전 연산자이므로 이 또한 어렵지 않습니다. shl, shr 경우 또한 시프트 이므로! 패스, ushr의 경우 좀 이해가 안 될 수 있으나 계산기로 두드려 보며 이해하면 사실 간단합니다. 🍔
이번 글에서는 코드를 설명하는 것이 아니라 결과를 보고 해당 연산자가 어떤 기능인지 유추해보는 시간을 가졌습니다. 간단하게 어떤 키워드가 무슨 연산자라고 이해하는 것보다 확실히 이해가 되셨을 거라고 생각됩니다. 그럼 다음 글에서 뵙겠습니다. 글 봐주셔서 감사합니다!
[Android/Kotlin] - [코틀린] 증감 연산자(++,--) 이해하는데 3초 컷
[Android/Kotlin] - [코틀린] 산술 연산자 +-*/% (Arithmetic Operator) 초간단 이해 법
'Android > Kotlin' 카테고리의 다른 글
[코틀린] 실수(Float, Double) 타입을 다룰 때 주의해야 할 점 (오차) (0) | 2020.07.19 |
---|---|
[코틀린] 정수, 실수 타입 정리 한 번에 끝내기 (Byte, Short, Int, Long, Float, Double) (0) | 2020.07.18 |
[코틀린] 증감 연산자(++,--) 이해하는데 3초컷 (0) | 2020.07.12 |
[코틀린] 산술 연산자 +-*/% (Arithmetic Operator) 초간단 이해법 (0) | 2020.07.11 |
[코틀린] 리터럴(literal) 에도 type이 있다는 것을 알았는가 (0) | 2020.07.10 |