CODING/강의노트-부스트코스-코틀린

[부스트코스]📱코틀린 2-4 연산자를 조합해 다양한 식 만들기 (2) 비트연산자

codingTrip 2021. 2. 4. 15:16

안녕하세요? codingTrip입니다.

오늘은 "코틀린 프로그래밍  1/2(함수편)"

1단원 코틀린의 기본을 익혀요!

2장. 변수와 자료형, 연산자

2-4 연산자를 조합해 다양한 식 만들기 (2) 비트연산자

시작하겠습니다!

 

 

🔑 비트 연산자

비트와 비트 연산 이해하기

- 1010(2) = 2^1+2^3 = 10(10)
- 가장 왼쪽에 있는 비트는 양(+), 음(-)을 판단하는 데 사용

[출처] 부스트코스 코틀린 강의자료

우리는 기본적으로는 10진수를 사용하고 있죠.

하지만 기계꺼졌다, 켜졌다 2가지의 상태를 가지고 있습니다.

그래서 좀 더 기계친화적인 표현은 2진법입니다.

 

비트 연산2진법의 체계,

그것을 가지고 다룰 수 있는 여러 가지 연산자가 있습니다.

 

2진법의 체계

각 자리 수를 2의 몇승으로 곱해주면 그걸 더해서 10진법으로 바꿀 수 있습니다.

예를 들어, 10진수인 5를 2진수로 바꿀 경우에는 아래와 같습니다.

쉽게 말하자면,

우리는 10진법에 익숙하잖아요?

사실 각 자리수는 10의 몇승을 더한 것인데 

우리는 자동적으로 111백십일로 계산하잖아요.

하지만 따져보면 10의 0승 + 10의 1승 + 10의 2승 해서 나온 결과값이죠?

10의 0승을 2의 0승으로 바꾼다라고 생각해보면 어떨까요?

2진법2의 0승, 2의 1승, 2의 2승 ... 이렇게 해당 자리에 0인지 1인지 파악해서 계산하면 된답니다.

 

비트

우리가 쓰고 있는 자료형은 각각의 비트를 가지고 있습니다.

정수의 경우에도 32비트를 가지고 있습니다.

그 중 맨 앞자리부호비트이므로

최대 31비트까지 사용가능합니다.

 

 

비트 연산을 위한 비트 메서드

[출처] 부스트코스 코틀린 강의자료

비트 연산자는 

실제 여러분이 사용하는 숫자점(.)을 사용해서 함수형태로 정의되어 있습니다.

 

4.shl(bits)

ex) 4.shl(3)

연산자 표기법으로 하려면 중위 표현법 4 shl 3 으로 사용할 수 있습니다.

shllleft(왼쪽)l입니다. 즉, 왼쪽으로 설정한 비트 수만큼 밀어냅니다.

10진수42진수로 표현하면 0100(2)이 됩니다.

이 수를 왼쪽으로 3만큼 밀어내면

000100(2)에서 100000(2)으로 꽤 큰 값이 나옵니다.

 

 

7.shr(bits)

ex) 7.shr(2)

shr의 rright(오른쪽) shl과 반대로 오른쪽으로 설정한 비트 수만큼 밀어내는 것입니다.

10진수인 7을 2진수로 표현하면 0111(2)가 됩니다.

이 수를 2개의 자리오른쪽으로 밀기 때문에

밀린 2개의 값은 날아갑니다. 0001(2)

 

위 두 비트 연산자는 부호비트가 있어, 부호비트유지됩니다.

 

 

12.ushr(bits)

ushr u부호비트가 없다는 의미입니다.

rright shr처럼 동일하게 연산하면 됩니다.

 

9.and(bits)

and논리곱에 해당합니다.

위의 예시처럼

and둘 중 하나라도 0인 경우에는 0이 됩니다.

둘다 1일 경우에만 1이 됩니다.

 

 

4.or(bits)

or논리합에 해당합니다.

or둘 중의 하나라도 1인 경우에는 1이 됩니다.

 

 

24.xor(bits)

xor배타적 연산입니다.

두 비트가 서로 다를 경우에만 1을 처리합니다.

1,0이나 0,1같이 두 비트가 서로 다를 경우에만 1을 표시합니다.

 

 

78.inv()

inv()값을 뒤집습니다.

이렇게 0101(2)1010(2)로 값을 뒤집습니다.

 

💻 실습

section03폴더Alt+Insert하고 코틀린 파일을 만듭니다.

파일명 BitOp.kt로 합니다.

package chap02.section03

fun main() {
    val x=4//10진법 0100(2) 4(10)
    val y=0b0000_1010 // 2진표기법 5(10) 네 자리마다 _하면 구분 쉽습니다.
    val z= 0x0f//16진 표기법 0b0000_1111(2) 15(10)
    println("x shl 2-> ${x.shl(2)}") //16(10) 0001_0000(2)
    println("x inv 2-> ${x.inv()}") // 111....1011(2)
}

먼저 변수 x는 10진법으로 표기했습니다.

변수 y는 2진 표기법으로, 변수 z는 16진 표기법으로 표기했습니다.

16진 표기법의 한 자리2진 표기법의 4자리가 됩니다.

tip) 4자리마다 _으로 구분하면 보기가 쉽습니다.

0b00001111보다는 0b0000_1111이 더 보기 편하죠?

 

그럼 비트 연산자를 사용해볼까요?

변수 x에 shl연산자를 사용해보겠습니다.

4.shl(2)은 어떤 값이 나올까요?

그리고 4.inv()은 어떤 값이 나올까요?

위에서 배우신대로 컴퓨터가 결과값을 출력하기 전에 스스로 계산해보세요.

 

Alt+Shift+F10을 누르고 2번을 눌러 실행해봅니다.

x.shl(2)16이 나왔네요.

10진수인 4를 이진수로 바꾸면 0100(2)에서 두 자리 왼쪽으로 밀면 10000(2) 즉, 16이 됩니다.

참고로 x.shl(2)연산자처럼 쓸 수 있기 때문에

x shl 2 이렇게 사용할 수 있지만

inv함수형으로 밖에 사용 불가능합니다.

 

x.inv()-5가 되네요.

2의 보수 표현법으로 모두 반대로 계산되어 나옵니다.

10진수인 4를 이진수로 바꾸면 0100(2)을 뒤집으면 1111....1011(2)이 됩니다.

부호도 양의 부호 +에서 음의 부호 - 로 바뀝니다.

사실 저도 2의 보수에 대해 전에 선생님께서 설명해주신 부분으로 밖에 몰라서 ㅠㅠ

codingtrip.tistory.com/14

 

[부스트코스]📱코틀린 2-1 기본 자료형과 변수 선언방법 (3) 크기 범위와 기타 자료형

안녕하세요? codingTrip입니다. 오늘은 "코틀린 프로그래밍  1/2(함수편)" 1단원 코틀린의 기본을 익혀요! 2장. 변수와 자료형, 연산자 2-1 기본 자료형과 변수 선언방법 (2) 크기 범위와 기타 자료형

codingtrip.tistory.com

제가 쓴 글을 링크 걸었습니다. 참고해주시면 감사하겠습니다.

선생님께서 전에 가르쳐주신 내용을 참고해서

제가 나름대로 계산해보았습니다. 이도 참고해주시면 감사하겠습니다.

 

 

오늘은 비교적 생소한 비트 연산자에 대해 배웠습니다.

저는 개인적으로 마지막 2의 보수 설명을

선생님께서 더 해주셨으면 좋았을 것 같아요.

4.shl(3) 등도 그림자료로

예시를 더 보여주셨으면 좋았을 것 같아요.

생소한 연산자, 표현에 좀 더 많은 시간을 할애해주시길 바랍니다.

 

이 강의 뒤에 퀴즈를 풀어보는 시간이 있어요.

여러분 몇 점 나오셨나요?

퀴즈를 통해 그동안 배웠던 내용을

다시 한 번 되새겨보는 시간을 가지시길 바라요.

 

그럼 다음 시간에 만나요.

 

 

부스트코스 서포터즈 3기 codingTrip