본문 바로가기

Language/Kotlin

[Kotlin] 비트연산

728x90
반응형

비트연산: 정수형 변수를 10진법 대신 2진법 비트 단위로 연산할 수 있는 기능

 

실무에서 비트연산은 거의 계산에는 사용하지 않으며 (2진법을 이용한 연산 최적화가 필요하다면 컴파일러의 기능을 사용하는 경우가 대부분!!) 정수형의 값을 비트 단위로 나누어 데이터를 좀 더 작은 단위로 담아 경제성을 높이기 위한 용도로 사용된다. 예를 들어, 32비트인 Int 타입 안에 0과 1로 된 서로 다른 값을 넣는다거나 앞의 5비트와 뒤의 27비트에 서로 다른 값을 넣는 식으로 변수 하나에 여러 개의 값을 담아 사용할 수 있다.

 

다만 비트연산을 사용하는 부하도 무시할 수 없으므로 주로 플래그 값(여러 개의 상태값을 0과 1로 담는 방법)을 처리하거나 네트워크 등에서 프로토콜의 데이터 양을 줄이기 위해 자주 사용된다.

(상위비트) 00010101001110101101111000001001 (하위비트)

 

코틀린은 모든 정수형이 부호를 포함하므로 최상위 비트를 0이면 양수, 1이면 음수인 부호비트로 사용한다. 이 부분에는 데이터를 담지 않는 것이 좋다.

00010101001110101101111000001001

bitwise shift operators

  • shl (shift left) : 부호비트를 제외한 모든 비트를 좌측으로 밀어줌
  • shr (shift right) : 부호비트를 제외한 모든 비트를 우측으로 밀어줌
  • ushr(unsigned shift right) : 부호비트를 포함하여 모든 비트를 우측으로 밀어줌

bitwise operators

  • and : 비트가 둘 다 1인 자리만 1로 반환함 1010 and 0110 → 0010
  • or : 비트가 둘 중 하나라도 1인 자리는 1로 반환함 1010 or 0110 → 1110
  • xor : 비트가 같은 자리는 0, 다른 자리는 1로 반환함 1010 xor 01101100

and 연산자는 그 특성을 이용하여 두 가지 기능으로 사용한다.

  • 비트 확인 : 원하는 자리에 1을 넣어 그 자리가 0인지 1인지 확인
  • 원본 0110 and 비교값 0100 → 결과값 0100
  • 비트 clear : clear하고 싶은 자리에 0을 넣어 연산
  • 원본 0110 and 비교값 1100 → 결과값 0100

or 연산자는 반대로

  • 비트 set : 비트 값을 1로 설정하고 싶은 자리에 1을 넣어 연산
  • 원본 0110 or 비교값 1100 → 결과값 1110

xor 연산자는

  • 비트들이 같은지 비교
  • 원본 0110 xor 비교값 1100 → 결과값 1010

inv()

: 비트를 모두 반전시킨다.

01101001 → 10010110

 

 

var bitData: Int = 0b10000

bitData = bitData or(1 shl 2)  // 0b10000 or 0b100 -> 0b10100
println(bitData.toString(2))  // 10100
// * 2진수 형태로 변경하여 출력(정수형의 경우 toString의 파라미터로 진법변환을 할 수 있다.)

var result = bitData and(1 shl 4)  // 0b10100 and 0b10000 -> 0b10000
println(result.toString(2))  // 10000

println(result shr 4)  // 1

bitData = bitData and((1 shl 4).inv())  // 0b10100 and 0b01111 -> 0b00100
println(bitData.toString(2))  // 100

println((bitData xor(0b10100)).toString(2))  // 10000
728x90
반응형