이진법과 비트 연산 feat.kotlin
이진법
정의
이진법(二進法, 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))
}
