오늘도 더 나은 코드를 작성하였습니까?

이진법과 비트 연산 feat.kotlin 본문

Algorithm/개념

이진법과 비트 연산 feat.kotlin

hik14 2023. 10. 21. 14:39

이진법

정의

이진법(二進法, binary)은 두 개의 숫자(0과 1)만을 이용하는 수 체계이다.

  * 이진수 각 자릿수에 따른 표현 가능한 수.

 

1자리 -> 0, 1

2자리 -> 00, 01, 10, 11

3자리 -> 000, 001, 010, 011, 100, 101, 110, 111

n자리 -> 2^n개

변환

10진수 -> 2진수 

예) 20 

1이 될때까지 나눠서 나머지를 모음.

fun decimalToBinary(n: Int): IntArray {

    var decimal = n
    val arr = IntArray(32) { 0 }

    var idx = 0
    while (decimal != 1) {
        arr[idx] = decimal % 2
        decimal /= 2
        idx += 1
    }
    
    arr[idx] = decimal
    println(arr.joinToString(" "))
    return arr
}
fun main() {
    /*
        이진법 변환
     */

    val n = 20
    println("20의 이진수 ${Integer.toBinaryString(n)}")
    
}

2진수 -> 10진수 

 

예) 20

1 0 1 0 0 

-> 2^4*1 + 2^3*0 +  2^2*1+ 2^1*0+ 2^0*0

-> 20

fun main() {
    /*
        kotlin 진법 변환
     */
    println("10100".toInt(2))
}

 

* 2의 보수

어떤 이진수를 커다란 2의 제곱수에서 빼서 얻은 이진수이다.

2의 보수는 대부분의 컴퓨터 프로그래밍 산술연산에서 원래 숫자의 음수처럼 취급된다.

 

1. 비트를 반전시킨다(1의 보수)

2. 1을 더한다

fun main() {
    /*
        2의 보수 (음수 이진수)
     */
    
    val n = 7
    
    println("7의 이진수 ${Integer.toBinaryString(n)}")
    println("${7.inv() + 1}의 이진수 ${Integer.toBinaryString(-n)}")

}

 

비트연산 

한 개 혹은 두 개의 이진수에 대해 비트 단위로 적용되는 연산이다.

 

1. AND( & ) 

두 값의 각 자릿수를 비교해, 두 값 모두에 1이 있을 때에만 1을, 나머지 경우에는 0을 계산한다.

2. OR ( | )

두 값의 각 자릿수를 비교해,  두 값의 각 자릿수를 비교해, 둘 중 하나라도 1이 있다면 1을, 아니면 0을 계산한다.

3. XOR ( ^ ) 

두 값의 각 자릿수를 비교해,  두 값의 각 자릿수를 비교해, 값이 같으면 0, 다르면 1을 계산한다.

4. NOT(~) 

각 자릿수의 값을 반대로 바꾸는 연산이다.

0 -> 1

1 -> 0

 

5. Shift 연산자 (<<, >>)

이진수의 모든 자릿수를 왼쪽 또는 오른쪽으로 이동시킨다.

 

A << B  A를 왼쪽으로 B칸 이동시킴 (모든 자릿수가 1칸씩 자릿수가 상승하여 숫자 전체는 2배가 된다)

A >> B  A를 오른쪽으로 B칸 이동시킴 (모든 자릿수가 1칸씩 자릿수가 상승하여 숫자 전체는 1/2배가 된다)

 

*kotlin 에서는 

shl (<<)

shr (>>)

fun main() {
    /*
        비트 연산
     */

    val a = 12 // 1100
    val b = 5 //   101

    println(Integer.toBinaryString(a and b))
    println(Integer.toBinaryString(a or b))
    println(Integer.toBinaryString(a xor b))
    println(Integer.toBinaryString(a.inv()))

    println(Integer.toBinaryString(b shl 1))
    println(Integer.toBinaryString(a shr 1))
}