(Kotlin/코틀린) 비트 연산자 — and, or, xor, shl, shr


1. Kotlin 비트 연산자 목록

Kotlin은 Java의 &, |, ^, ~, <<, >>, >>> 대신 함수 이름 형태를 사용합니다.

Kotlin Java 설명
a and b a & b AND: 둘 다 1이면 1
a or b a \| b OR: 하나라도 1이면 1
a xor b a ^ b XOR: 다르면 1
a.inv() ~a NOT: 비트 반전
a shl n a << n 왼쪽 시프트
a shr n a >> n 오른쪽 시프트 (부호 유지)
a ushr n a >>> n 오른쪽 시프트 (부호 무시)

2. 기본 동작

val a = 0b1010  // 10
val b = 0b1100  // 12

println(a and b)   // 0b1000 = 8   (둘 다 1인 비트만)
println(a or b)    // 0b1110 = 14  (하나라도 1인 비트)
println(a xor b)   // 0b0110 = 6   (서로 다른 비트)
println(a.inv())   // -11           (모든 비트 반전)
println(a shl 1)   // 0b10100 = 20 (1비트 왼쪽 = ×2)
println(a shr 1)   // 0b0101 = 5   (1비트 오른쪽 = ÷2)

3. 실전 패턴 — 권한 플래그

비트 플래그로 여러 권한/옵션을 하나의 Int에 효율적으로 저장합니다.

object Permission {
    const val NONE   = 0b0000  // 0
    const val READ   = 0b0001  // 1
    const val WRITE  = 0b0010  // 2
    const val DELETE = 0b0100  // 4
    const val ADMIN  = 0b1000  // 8
    const val ALL    = READ or WRITE or DELETE or ADMIN  // 15
}

// 권한 부여
var userPermission = Permission.NONE
userPermission = userPermission or Permission.READ
userPermission = userPermission or Permission.WRITE
// userPermission = 0b0011 = 3

// 권한 확인
fun hasPermission(permission: Int, flag: Int): Boolean = (permission and flag) != 0
println(hasPermission(userPermission, Permission.READ))    // true
println(hasPermission(userPermission, Permission.DELETE))  // false

// 권한 제거
userPermission = userPermission and Permission.WRITE.inv()
// WRITE 비트만 0으로 → READ만 남음
println(hasPermission(userPermission, Permission.WRITE))   // false

4. 실전 패턴 — 색상 처리 (ARGB)

Android의 색상값(ARGB)은 32비트 정수로 표현됩니다.

val color = 0xFF_AA_BB_CC.toInt()  // 0xAA: Alpha, 0xBB: Red, 0xCC: Green (예시 형식)

// 각 채널 추출
val alpha = (color ushr 24) and 0xFF
val red   = (color ushr 16) and 0xFF
val green = (color ushr  8) and 0xFF
val blue  =  color          and 0xFF

println("A=$alpha R=$red G=$green B=$blue")

// 색상 조합
fun argb(a: Int, r: Int, g: Int, b: Int): Int =
    (a shl 24) or (r shl 16) or (g shl 8) or b

val white = argb(255, 255, 255, 255)
val red50 = argb(128, 255, 0, 0)  // 50% 투명 빨강

5. 실전 패턴 — 2의 거듭제곱 최적화

// 2의 거듭제곱 나누기/곱하기
val n = 1024
println(n shr 1)   // 512  (÷2)
println(n shr 2)   // 256  (÷4)
println(n shl 1)   // 2048 (×2)
println(n shl 3)   // 8192 (×8)

// 짝수 홀수 판별 (% 2보다 빠름)
fun isEven(n: Int) = (n and 1) == 0
fun isOdd(n: Int) = (n and 1) != 0

// 2의 거듭제곱 여부 확인
fun isPowerOfTwo(n: Int) = n > 0 && (n and (n - 1)) == 0
println(isPowerOfTwo(16))  // true
println(isPowerOfTwo(15))  // false

6. shr vs ushr

val negative = -8  // 부호 있는 음수

println(negative shr 1)   // -4  (부호 유지: 최상위 비트 1로 채움)
println(negative ushr 1)  // 2147483644  (부호 무시: 최상위 비트 0으로 채움)
연산자 용도
shr 일반적인 나눗셈 (부호 보존)
ushr 비트 조작 (부호 없는 처리, 색상값 등)

7. 정리



Related Posts