일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ㅋㅁ
- 코틀린
- builderPattern
- ㅓ
- factory method
- designPattern
- Abstract Factory
- 팩토리 메소드
- 디자인패턴 #
- PrototypePattern
- F
- Kotlin
- 디자인패턴
- 추상 팩토리
- a
- 함수형프로그래밍
- Singleton
- r
- 싱글톤
- El
- Functional Programming
- 옵저버 패턴
- Observer Pattern
- 추상팩토리패턴
- 빌터패턴
- 프로토타입 패턴
- Design Pattern
- Today
- Total
오늘도 더 나은 코드를 작성하였습니까?
이진법과 비트 연산 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))
}
'Algorithm > 개념' 카테고리의 다른 글
비트마스킹(BitMask) 활용 feat. kotlin (1) | 2023.10.27 |
---|---|
비트 연산을 활용한 비트 마스킹(BitMask) feat. kotlin (0) | 2023.10.25 |
그래프 탐색 - 너비우선 탐색 (BFS Breadth-First Search) feat.kotlin (0) | 2023.10.13 |
그래프 탐색 - 깊이우선 탐색 (DFS Depth-First Search) feat.kotlin (0) | 2023.10.12 |
그래프(graph)의 기본 개념(feat.kotlin) (2) | 2023.10.12 |