비트 연산

LEEHEES·2022년 7월 16일
0

Kotlin

목록 보기
12/13
post-thumbnail

정수형 변수를 10진법 대신 2진법으로 연산할 수 있는 단위

실무에서는 계산에서는 거의 사용하지 않으며
정수형의 값을 비트 단위로 나누어 데이터를 좀 더 작은 단위로 담아
경제성을 높이기 위한 용도로 사용
( 2진법을 이용한 연산 최적화가 필요하다면 컴파일러의 기능을 사용하는 경우가 대부분 )

변수 하나에 여러 개의 값을 담아 사용하는 등으로 사용

단, 비트연산을 사용하는 부하도 무시할 수 없으므로
주로 플래그 값을 처리하거나
네트워크에서 프로토콜의 데이터 양을 줄이기 위해 자주 사용됨

좌측으로 갈 수록 상위비트
우측으로 갈 수록 하위비트

코틀린은 모든 정수형이 부호를 포함하므로
최상위 비트를 부호비트로 사용하기 때문에 데이터를 담지 않는 것이 좋음

bitwise shift operator

부호 비트를 제외한 모든 비트를 밀어주는 기능

좌측으로 밀어주는 shl
우측으로 밀어주는 shr
부호비트를 포함하여 우측으로 밀어주는 ushr

bitwise operator

둘 다 1인 경우 1을 반환하는 and
→ 특정 위치에 1이 있는지 확인하는 용도
→ 특정 위치를 0으로 만드는 용도

둘 중 하나만 1인 경우 1을 반환하는 or
→ 특정 위치를 1로 만드는 용도

두 비트가 다른 경우 1을 반환하는 xor
→ 특정 위치가 동일한지 확인하는 용도

inv() 함수

비트를 모두 반전시키는 함수

풀코드

※ 출력 시 처음으로 1이 등장한 비트부터 출력
fun main() {

    var bitData: Int = 0b10000

    println(bitData.toString(2))

    bitData = bitData or (1 shl 2)
    println(bitData.toString(2))
//    00001 ( 1 )
//    00100 ( 1 shl 2 )
//    10000 [ bitData ]
//    10100 ( bitData or (1 shl 2) )

    var result = bitData and (1 shl 4)
    println(result.toString(2))
//    00001 ( 1 )
//    10000 ( 1 shl 4 )
//    10100 [ bitData ]
//    10000 ( bitData and (1 shl 4) )

    println(result shr 4)
//    00001 ( result shr 4 )
//    1 [ 10진수로 출력 ]

    bitData = bitData and ((1 shl 4).inv())
    println(bitData.toString(2))
//    00001 ( 1 )
//    10000 ( a shl 4 )
//    01111 ( (1 shl 4).inv() )
//    10100 [ bitData ]
//    00100 ( bitData and ((1 shl 4).inv()) )

    println((bitData xor (0b10100)).toString(2))
//    00100 ( bitData )
//    10100 ( 0b10100 )
//    10000 ( bitData xor (0b10100)) )

}

//10000
//10100
//10000
//1
//100
//10000
profile
iOS 개발 공부

0개의 댓글