본문 바로가기
쿤즈 Dev/Kotlin

[Kotlin] 코틀린에서 사용하는 연산자 알아보기(2)

by :)Koon 2022. 5. 11.

앞선 포스팅에서는 코틀린에서 사용하는 연산자들에 대해서 알아보았습니다.

2022.05.10 - [쿤즈 Dev/Kotlin] - [Kotlin] 코틀린에서 사용하는 연산자 알아보기(1)

 

[Kotlin] 코틀린에서 사용하는 연산자 알아보기(1)

코틀린에서는 다른 언어와 마찬가지로 연산자가 있습니다. 다른 언어와 동일하게 사용하는 연산자가 있는 반면 다른 언어에 없는 연산자들도 있습니다. 이번 포스팅에서는 코틀린에서 사용하

koonsland.tistory.com

연산자들중 다루지 않은 하나가 있습니다. 바로 비트연산자입니다.

이번 포스팅에서는 연산자의 마지막인 비트연산자에 대해서 알아보도로 하겠습니다.


비트 연산자

비트는 데이터를 저장하는 최소 단위를 의미합니다. 컴퓨터는 이진수를 해석하는 기계죠. 이때 이진수를 연산할 수 있는 연산자가 바로 비트연산자입니다. 그래서 0과 1을 처리하는데 사용합니다.

 

비트연산자는 자주 사용되지는 않습니다. 기계어를 다루거나 IoT기기, 혹은 암호화 프로그래밍을 할때 주로 다루게 되지만 알아둘 필요는 있습니다.


이진수 나타내기

비트 연산자를 알기 위해서는 이진수는 필수로 알아야합니다. 우리는 10진수를 사용하기 때문에 0~9까지의 수를 이용해서 계산합니다. 그리고 10이 되는순간 자리가 하나 올라가는 것이죠. 마찬가지로 2진수는 2가 되는순간 자리가 하나 올라가는 것입니다. 예를 들어볼게요

 

1 = 1

2 = 10, 2진수에서 2가 나올 순 없습니다. 그래서 자리가 하나 올라가는 것입니다.

3 = 11

4 = 110, 3을 나타내는 11에서 1을 더하면 12가 되고 자리가 올라갑니다. 그럼 20이 되겠죠. 그런데 또 2가 나오네요. 다시 자리를 올려줍니다. 그래서 110이 되는 것입니다.

 

그렇다면 32비트 컴퓨터는 1을 어떻게 표현할까요? 총 32개의 자리를 표현 할 수 있다는 이야기이며 각 자리를 비트라 합니다.

0000 0000 0000 0000 0000 0000 0000 0001 = 1

비트 이동(Shift)

이번에는 비트의 이동을 알아볼게요. 비트 이동은 자리를 이동시키는 것입니다. 위에서 본 32비트 컴퓨터에서 1이라는 값에서 왼쪽으로 2만큼 비트를 이동하면 어떻게될까요?

0000 0000 0000 0000 0000 0000 0000 0100 = 4

결과는 4가 됩니다. 그렇다면 가장 왼쪽으로 비트를 이동시키면 어떤 값일까요?

1000 0000 0000 0000 0000 0000 0000 0000 = -2^31

컴퓨터에서 가장 왼쪽은 최상위 비트라고 하며 부호를 나타냅니다. 그렇다면 가장 큰 값은 무엇일까요?

0111 1111 1111 1111 1111 1111 1111 1111 = 2^31 - 1

비트 연산자를 알면 최대 최소값도 쉽게 알 수 있습니다.


비트 연산자

비트 연산을 하기 위해서 사용하는 비트연산자가 있습니다. 비트를 이동시키는 연산, and, or, xor, inv 연산이 있습니다. 

연산자 설명
shl shift left 의 의미로 왼쪽으로 비트 이동
shr shift right 의 의미로 오른쪽으로 비트 이동
ushr unsigned shift right의 의미로 부호없이 오른쪽으로 비트 이동
and 비트 논리 곱
or 비트 논리 합
xor 비트 exclusive or 배타적 연산
inv 비트 전체 뒤집음

예를 들어서 알아볼게요.

package `02`

fun main(args: Array<String>) {
    val num1: Int = 16 // 0001 0000
    val num2: Int = 27 // 0001 1011

    // 0010 0000
    println("num1 shl 1 = ${num1 shl 1}")
    // 0000 0100
    println("num1 shr 2 = ${num1 shr 2}")
    // 0000 0100
    println("num1 ushr 2 = ${num1 ushr 2}")
    // 0001 0000
    println("num1 and num2 = ${num1 and num2}")
    // 0001 1011
    println("num1 or num2 = ${num1 or num2}")
    // 0000 1011
    println("num1 xor num2 = ${num1 xor num2}")
    // 1110 0100
    println("num2 inv = ${num2.inv()}")
}

shl, shr 연산은 위에서 설명한것과 같이 비트를 이동하는 연산입니다.

and 연산은 두 비트가 동일한 비트에서만 1이 되는 연산입니다.

or 연산은 두 비트중 하나만 1이 되도 1이되는 연산입니다.

xor는 두 비트가 달라야만 1이 되는 연산입니다.

inv 연산은 비트 전체를 반대로 바꿔주는 연산입니다.

 

이러한 연산들이 왜 필요할까요? 컴퓨터는 비트연산을 할때 속도가 가장 빠릅니다. 예를들어서 16*2 라는 연산을 하는 것보다 16 shl 1을 하는 연산이 더 빠른 것이죠.


지금까지 코틀린의 연산자 두 번째로 비트 연산자에 대해서 알아보았습니다. 비트 연산자는 자주 사용하는 건 아니지만 알아두면 연산에 필요할때 사용 할 수 있는 부분들이 많이 있습니다. 도움이 되셨으면 합니다. 이상입니다.

댓글