일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 알고리즘
- 클라우드
- 도커 elk
- 스트림셋
- java
- C언어
- elk stack
- mysql docker
- 자바
- streamsets 강의
- docker
- c
- c++
- 데이트
- 파이썬
- 앤서블 설치
- 도커 mysql
- ansible install
- nvidia docker
- 정보처리기사
- 코딩
- 도커 시작하기
- 데이터베이스
- MySQL
- 푸시푸시
- 백준
- 스트림셋이란?
- 도커
- mysql on docker
- python
- Today
- Total
리그캣의 개발놀이터
컴퓨터 구조론 3장 연습문제 풀이 본문
컴퓨터 구조론 3장 연습문제 풀이
3.15부호 없는 2진수들 간의 곱셈 (1001X0111)이 수행되는 과정을 그림
3-13과 같이 작성하라.
C A Q
[초기 상태] 0 0000 0111
[사이클 1] 0 1001 0111;Q(0)=1이므로 A<-A+M
0 0100 1011 ;우측 쉬프트(C-A-Q)
[사이클 2] 0 1101 1011 ;Q(0)=1이므로 A<-A+M
0 0110 1101 ;우측 쉬프트(C-A-Q)
[사이클 3] 1 0011 1101 ;Q(0)=1이므로 A<-A+M
0 1001 1110 ;우측 쉬프트(C-A-Q)
[사이클 4] 0 0100 1111 ;Q(0)=0이므로 우측쉬프트
3.16 2의 보수로 표현된 5-비트 데이터 간의 곱셈 (10101X01101)이 Booth 알고리즘으로 수행되는 과정을 실제 프로그래밍으로 구현해보아라.
Booth's Algorithm[출처:Lecture2_BinaryMultiplication.pdf]
위에 알고리즘에서 알 수 있다 시피 C로 프로그래밍 하기 위해서는 M레지스터 Q레지스터 A레지스터가 필요하다. M레지스터는 피승수를 저장할수 있어야 하며, A레지스터는 초반부에 00000으로 세트 되어있어야 한다. 또 Q레지스터는 총 6비트가 필요한데 Q(-1)에는 0으로 세트 되고 나머지는 승수가 세트되어야 한다. 그리고 5비트임으로 Count는 5가 되어야 한다.
int main()
{
char A[5]={0,0,0,0,0}, Q[6]={0,1,1,0,1,0};
char M[5]={1,0,1,0,1};
int Count = 5;
}
본문으로 들어가게 되면 for문이 필요하다 c이는 Count에 따라서 돌려야 되기 때문이다.
for(Count;Count>=0;Count--)
{
}
그리고 for 문안에서 Q(0),Q(-1) 이 01,10,00,11 인 경우의 세 가지로 나누어지는데 Q(0)과 Q(-1)이 일치하면 산술적 우측 쉬프트만 쓰여지게 되고 일치하지 않으면 두가지 경우로 나누어 질수 있다.
if(Q[4]==1&&Q[5]==0)//Q(0),Q(-1) = 10 이면
{
SETA=Binary_To_Decimal(A); //A를 10진수로 변환 후 SETA에 저장
SETM=Binary_To_Decimal(M);//M을 10진수로 변환 후 SETM에 저장
SETA=SETA-SETM;//A-M을 실행
*A=Decimal_To_Binary(SETA);//다시 A레지스터에 A-M의 2진수 저장
}
else if(Q[4]==0&&Q[5]==1)//Q(0),Q(-1) = 01 이면
{
SETA=Binary_To_Decimal(A); //A를 10진수로 변환 후 SETA에 저장
SETM=Binary_To_Decimal(M);//M을 10진수로 변환 후 SETM에 저장
SETA=SETA+SETM;//A+M을 실행
*A=Decimal_To_Binary(SETA);//다시 A레지스터에 A+M의 2진수 저장
}
int Binary_To_Decimal(char *);//2진수를 10진수로 변환 시켜주는 함수
char Decimal_To_Binary(int );//10진수를 2진수로 변환 시켜주는 함수
자 이제 산술적 우측 쉬프트만 시켜주면된다.
Q[5]=Q[4];Q[4]=Q[3];Q[3]=Q[2];Q[1]=Q[0];
Q[0]=A[4];A[4]=A[3];A[3]=A[2];A[2]=A[1];A[1]=A[0]; //A[0]은 그대로 둔다.
3.20 아래의 10진수들을 IEEE754표준 32-비트 부동소수점 형식으로 표현하라.
(1) 5(10)= 101(2) = 1.01X2^2
부호(S)비트 = 0(+)
지수 E = 00000010+01111111(바이어스127을 더한다.)
=10000001
가수 M = 01000000000000000000000
S | E | M |
0 | 10000001 | 01000000000000000000000 |
(2) 253.25(10)= 11111101.01(2) = 1.111110101X2^7
부호(S)비트 = 0(+)
지수 E = 00000111+01111111(바이어스127을 더한다.)
=10000110
가수 M = 11111010100000000000000
S | E | M |
0 | 10000110 | 11111010100000000000000 |
(3) -1.625(10)= 1.101(2) = 1.101X2^0
부호(S)비트 = 1(-)
지수 E = 00000000+01111111(바이어스127을 더한다.)
=01111111
가수 M = 10100000000000000000000
S | E | M |
1 | 01111111 | 10100000000000000000000 |
(4) -1/32(10)= 0.03125(10) =0.00001(2) = 1X2^-5
부호(S)비트 = 1(-)
지수 E = 11111011+01111111(바이어스127을 더한다.)
=11110100
가수 M = 00000000000000000000000
S | E | M |
1 | 11110100 | 00000000000000000000000 |
3.23 아래의 부동소수점 산술 연산들을 수행하라. 단, 연산을 수행한 후에는 반올림을 이용하여 결과값의 소수점 아래 6자리까지만 남기도록 하라.
(1) (0.111001X2^-5)+(0.100111X2^-3)
(1) 지수 조정 (0.00111001X2^-3)+(0.100111X2^-3)
(2) 더하기 0.11010101X2^-3
(3) 정규화 하기 0.11010101X2^-3
(2) (0.100011X2^6)-(0.111001X2^3)
(1) 지수 조정 (0.100011X2^6)-(0.000111001X2^6)
(2) 빼기 0.011110111X2^6
(3) 정규화 하기 0.11110111X2^5
(3) (0.1001X2^8)X(0.1011X2^12)
(1) 가수 곱하기 (0.1001)X(0.1011)=0.1100011
(2) 지수 더하기 8+12=20
(3) 정규화 하기 0.1100011X2^20
'프로그래밍 기본 > 컴퓨터 구조론' 카테고리의 다른 글
process와 thread의 차이점 (0) | 2019.04.18 |
---|---|
컴퓨터 구조론 2장 연습문제 정답 (0) | 2018.01.21 |
컴퓨터 구조론 연습문제 4장 (0) | 2018.01.21 |
컴퓨터 구조론 2장 연습문제 풀이 (5) | 2018.01.21 |