개발 교육 일기

파이썬 교육 Day2 (+ 파이썬, 16진수를 10진수로 변환, 2진수 출력, 왼쪽 & 오른쪽 n-bit circular shift 등 )

오이띠 2021. 3. 16. 16:36
728x90

오늘은 첫 온라인 수업 날이고, 입실+매 교시+퇴실 출석체크를 했다. 

어제 진도가 너무 빨라서 걱정했는데, 오늘은 실습문제 4개 정도 푸는걸로 마무리 했다. 휴.... 

그리고 실습문제로 어제 배운 내용을 더 깊이 이해할 수 있고,  각 실습문제에 여러 개념이 있어서 좋았다~

 

 

 

<실습 문제1> 16진수를 10진수로 만드는 프로그램

 

16진수를 10진수로 만드는 프로그램을 짜야하는 문제다. 추가로, 16진수의 알파벳(A~F)이 나올 수 있고, 소문자는 취급 안하기로 했다!

 

결과: 

 

 

여기서 중요한 부분은 value = value *16 + v라는 문장이다.

이렇게 서술한 이유는 역순으로 숫자를 바꿔서 풀면 속도가 너무 느려지기 때문이다. 

1의 자리부터 계산(역순)하는 대신, value = value * 16+v 라는 문장으로 계산한 예시는 다음과 같다. 

ex. s = 12B인 경우, 

   1단계: 1

   2단계: (1 * 16) + 2

   3단계: ((1 * 16) + 2) * 16 + B

 

ex2. s = ABC인 경우,

   1단계: A

   2단계: (A * 16) + B

   3단계: ((A * 16) + B) * 16 + C

 

 

 

 

 

<실습 문제2> 64비트 2진수를 출력시켜 주는 프로그램

 

 

결과: 

 

알아야 할 부분:

   1. bitwise and ( & ) 는 정보 추출 위해, bitwise or ( | )는 정보 추가 위해 사용

       ex. ★ & 1 을 하면: ★가 0일땐 결과가 0, ★가 1일땐 결과가 1 이 나옴

       ex. ★ | 1 을 하면: ★가 0이든 1이든 간에 결과가 1이 나옴(그래서 숫자가 0일 때 1로 바꿔줄 때 사용)

   2. 0x는 16진수, 0o는 8진수, 0b는 2진수

   3. 오른쪽 산술 시프트할 때, 부호가 0이면 앞에 0이 붙고, 부호가 1이면 앞에 모두 1이 붙음

       ex. a=100....01 → a = a >>2 11100...01 (맨 앞 비트가 1이였어서, 앞에 1만 추가됨)

       ex. a=000....01 → a = a >>2  00000...01 (맨 앞 비트가 0이였어서, 앞에 0만 추가됨)

   4. 왼쪽으로 산술 시프트할 때는 맨 뒤에 0만 추가됨

   5. 여기서 num1은 단순변수임!! 배열이 아님!!

   6. print("1", end = "" )에서 'end = ""'를 붙인 이유는.. 파이썬의 print의 디폴트는 마지막이 \n이라서! 

   7. 'num1 = num << 1'에서 산술shift로 check가 아니라 num을 이동시킴

 

 

 

 

<실습 문제3> 정수형 데이터를 왼쪽으로 n-bit circular shift 시켜주는 프로그램

 

결과: 

 

 

 

 

 

 

 

<실습 문제3-2> 정수형 데이터를 오른쪽으로 n-bit circular shift 시켜주는 프로그램

 

이 문제는 좀더 생각할게 많음. 

그래서 hint는 다음과 같음

 

1. num가 양수일 때(맨 앞 비트가 0)

    a. 마지막 비트가 0이면, 'num = num >> 1'

    b. 마지막 비트가 1이면,  'num = num >> 1' 하고 맨 앞비트는 1로 만들어줘야함

        (이유: 산술 shift는 num이 양수라서, 맨 앞 비트에 0이 붙으므로)

2. num가 음수일 때(맨 앞 비트가 1)

    a. 마지막 비트가 1이면, 'num = num >> 1'

    b. 마지막 비트가 0이면,  'num = num >> 1' 하고 맨 앞비트는 0으로 만들어줘야함

        (이유: 산술 shift는 num이 음수라서, 맨 앞 비트에 0이 붙으므로)

 

결과: 

 

처음엔 이렇게 짰는데.. 0x7FFFFFFFFFFFFFFF가 ~check임을 알게됨

 

그래서 최종 결과는.. 

 

 

코드: AI_Edu/Day2 at main · Heez27/AI_Edu (github.com)

 

 

<다음시간>

1. 5장(리스트), 6장(튜플과 딕셔너리) 진도를 나갈 예정

2. 보충교재 4장 추가로 나감

3. 오늘은 단순변수로 하는 실습이었지만, 내일부터는 단순변수 연산 안함!!

728x90