[Kotlin] 비트연산 설명 & 예제

728x90

비트연산

정수형 변수를 사람이 사용하는 10진법으로 연산하는 대신 2진법인 비트 단위로 연산할 수 있는 기능

  • 실무에서는 비트연산을 계산에는 거의 사용하지 않음
    • 2진법을 이요한 연산 최적화가 필요하다면 컴파일러의 기능을 사용하는 경우가 대부
  • 정수형의 값을 비트단위로 나누어 데이터를 좀더 작은 단위로 담아 경제성을 높이기 위한 용도로 사용함
    • 32비트에서 5비트 따로 27비트 따로 다른 값을 넣어 사용하는 등
    • 변수 하나에 여러개의 값을 담아 사용
    • 주로 플래그 값(상태를 0과 1로 담음) 처리 하거나 네트워크 등에서 프로토콜의 데이터량을 줄이기 위해 사용
    • 좌측으로 갈수록 상위 비트 우측으로 갈 수록 하위 비트 이다
    • 최상위는 부호 비트이기때문에 데이터를 담지 않는 것이 좋다

bitwise shift operators ( 비트를 밀어주는 )

  1. shl(shift left) : 부호 비트를 제외한 모든 비트를 좌측으로 밀어주는 기능
  2. shr(shift right) : 부호 비트를 제외한 모든 비트를 우측으로 밀어주는 기능
  3. ushr(unsigned shift right) : 부호 비트를 포함한 모든 비트를 우측으로 밀어주는 기능

bitwise operators ( 비트를 조작하는)

  1. and : 원본과 비교하여 둘다 1인 자리만 1로 반환
    • 비트를 확인하는 용도
      • 원하는 위치에만 1을 넣어 확인
    • 비트를 clear하는 연산
      • 원하는 자리에 0을 넣어 clear
  2. or : 원본과 비교하여 하나라도 1인 자리면 1로 반환
    • 비트의 set연산, 즉 비트 값을 1로 설정하고 싶을 때
      • 1을 넣어주면 1로 set 가능
  3. xor : 비트가 같으면 0, 다른자리는 1로 반환
    • 비트별로 동일한지 사용

inv() (비트를 반전하는!)

비트를 모두 반전 시키는 역할을 함

fun main() {
    //지정되지 않은 상위 비트는 0으로 채워짐
    var bitData: Int = 0b10000

    bitData = bitData or (1 shl 2)
    //10100
    println(bitData.toString(2))

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

    //1
    println(result shr 4)

    bitData = bitData and((1 shl 4).inv())
    //100
    println(bitData.toString(2))

    //10000
    println((bitData xor(0b10100)).toString(2))
}
728x90

댓글

Designed by JB FACTORY