티스토리 뷰

 이번 글에서는 코틀린의 비트 연산자(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] - [코틀린] 리터럴(literal) 에도 type이 있다는 것을 알았는가

댓글
댓글쓰기 폼
네이버 이웃추가
«   2020/08   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
글 보관함