-> 블로그 이전

[컴퓨터구조론] 3장 연습문제

2022. 2. 2. 22:00Solution`/컴퓨터구조론

[3.1]

다음 수들에 대한 8-bit 길이의 부호화-크기, 1의 보수 및 2의 보수 표현을 각각 구하라

(1) 19

8-bit 부호화-크기 : 0 001 0011
1의 보수 : 0001 0011
2의 보수 : 0001 0011

 

(2) -19

8-bit 부호화 크기 : 1 001 0011
1의 보수 : 1110 1100
2의 보수 : 1110 1101

 

(3) 124

8-bit 부호화 크기 : 0 111 1100
1의 보수 : 0111 1100
2의 보수 : 0111 1100

 

(4) -124

8-bit 부호화 크기 : 1 111 1100
1의 보수 : 1000 0011
2의 보수 : 1000 0100

 

 

[3.2]

문제 3.1의 각 결과가 값을 16-bit 길이의 표현으로 확장하라

(1) 19

16-bit 부호화-크기 : 0 000 0000 0001 0011
1의 보수 : 0000 0000 0001 0011
2의 보수 : 0000 0000 0001 0011

 

(2) -19

16-bit 부호화-크기 : 1 000 0000 0001 0011
1의 보수 : 1111 1111 1110 1100
2의 보수 : 1111 1111 1110 1101

 

(3) 124

16-bit 부호화-크기 : 0 000 0000 0111 1100
1의 보수 : 0000 0000 0111 1100
2의 보수 : 0000 0000 0111 1100

 

(4) -124

16-bit 부호화-크기 : 1 000 0000 0111 1100
1의 보수 : 1111 1111 1000 0011
2의 보수 : 1111 1111 1000 0100

 

 

[3.3]

2진수 '11101101'에 대한 10진수를 [예제 3-5]의 방법 및 [예제 3-6]의 방법으로 각각 구하고, 두 결과 값이 일치하는지 비교하라

[예제 3-5] 방법

1110 1101
>> -128 + (64 + 32 + 8 + 4 + 1) = -128 + 109 = -19

 

[예제 3-6] 방법

11101101
>> 1의 보수 + 1 : 00010010 + 1 = 00010011 = 19
>> - 붙여주기 : -19
  • 두 방법의 결과 값은 일치한다

 

 

[3.4]

그림 3-2의 논리 연산회로에 NAND, NOR 및 exclusive-NOR 연산 기능을 추가하여 다시 설계하고, 제어 신호들도 정의하라

연산 선택 신호 출력 연산
S3 S2 S1
0 0 0 AND
0 0 1 OR
0 1 0 XOR
0 1 1 NOT
1 0 0 NAND
1 0 1 NOR
1 1 0 exclusive-NOR
1 1 1 - -

 

 

[3.5]

A 레지스터에 '10101101', B 레지스터 '11000011'이 각각 저장되어 있는 상태에서 다음과 같은 논리 연산들을 수행한 결과를 구하라

(1) AND 연산

AND 연산 : 두 bit 모두 1이면 1로 설정

10101101
11000011
----------
10000001

 

(2) OR 연산

OR 연산 : 두 bit중 하나만 1이여도 1로 설정

10101101
11000011
----------
11101111

 

(3) XOR 연산

XOR 연산 : 두 bit가 서로 다르면 1로 설정

10101101
11000011
----------
01101110

 

 

[3.6]

아래의 좌측과 우측 연산들 간에 동일한 결과를 산출하는 연산들을 서로 연결하라

1. AND 연산					(1) 선택적-세트
2. OR 연산					(2) 선택적-보수
3. XOR 연산					(3) 마스크
선택적-세트 : 특정 bit들을 1로 설정
-> OR 연산을 통해서 수행

선택적-보수 : 특정 bit들을 reverse
-> XOR 연산을 통해서 수행

마스크 : 특정 bit들을 0으로 설정
-> AND 연산을 통해서 수행

2 - (1)
3 - (2)
1 - (3)

 

 

[3.7]

A 레지스터에 저장되어 있는 데이터 '11010010'의 우측 다섯 비트에 '01110'을 삽입하는 방법을 설명하라

(1) 마스크 연산을 통해서 삽입하고 싶은 위치의 bit들을 전부 0으로 만들어주기
A 레지스터 : 110 10010
B 레지스터 : 111 00000
---------------------- 마스크 연산 (AND 연산)
result : 110 00000

(2) 삽입하고 싶은 bit와 마스크 연산의 결과와 OR연산
result : 110 00000
삽입 bit : 000 01110
-----------------------OR 연산
result : 110 01110

 

 

[3.8]

8-bit 레지스터에 2의 보수 '11010010'이 저장되어 있을 때, 아래의 시프트 연산들이 수행된 결과를 구하라. 단, 각 연산은 원래의 레지스터 내용에 대하여 수행하라

(1) 논리적 우측-시프트

최하위 bit는 버려진다
최상위 bit는 0으로 설정
>> 0110 1001

 

(2) 논리적 좌측-시프트

최상위 bit는 버려진다
최하위 bit는 0으로 설정
>> 1010 0100

 

(3) 순환 우측-시프트

최하위 bit의 값은 최상위 bit로 옮겨진다
>> 0110 1001

 

(4) 순환 좌측-시프트

최상위 bit의 값은 최하위 bit로 옮겨진다
>> 1010 0101

 

(5) 산술적 우측-시프트

부호비트는 반드시 고정
크기 비트의 가장 왼쪽 bit는 부호 비트의 값으로 설정
크기 비트의 최하위 bit는 버려진다
>> 1 110 1001

 

(6) 산술적 좌측-시프트

부호비트는 반드시 고정
크기 비트의 가장 왼쪽 bit는 버려진다
크기 비트의 최하위 bit는 0으로 설정
>> 1 010 0100

 

 

[3.9]

8-bit 레지스터에 2의 보수'10110011'이 저장되어 있을 때, 아래의 시프트 연산들이 수행된 결과를 구하라. 단, 각 연산은 앞 연산의 결과값에 대하여 수행하라 (예 : (1)번 결과값에 대하여 (2)번 연산을 수행).

(1) 논리적 우측-시프트

최하위 bit는 버려진다
최상위 bit는 0으로 설정
>> 0110 1001

 

(2) 순환 좌측-시프트

최상위 bit의 값은 최하위 bit로 옮겨진다
>> 1011 0010

 

(3) 산술적 우측-시프트

부호비트는 반드시 고정
크기 비트의 가장 왼쪽 bit는 부호 비트의 값으로 설정
크기 비트의 최하위 bit는 버려진다
>> 1 101 1001

 

(4) 산술적 좌측-시프트

부호비트는 반드시 고정
크기 비트의 가장 왼쪽 bit는 버려진다
크기 비트의 최하위 bit는 0으로 설정
>> 1 011 0010

 

 

[3.10]

A 레지스터에 '10110011'이 저장되어 있고 C 플래그의 값은 '0'으로 세트되어 있다

(1) SHRC(C 플래그를 포함한 우측 시프트) 연산을 수행한 후의 A 레지스터 내용을 쓰라

C(0) 1011 0011 
SHRC 수행 : 0101 1001

 

(2) (1)의 결과에 대해서 SHLC 연산을 2번 연속 수행한 후의 A 레지스터 내용을 쓰라

0101 1001
SHLC 1번 수행 : C(0) 1011 0010
SHLC 1번 수행 : C(1) 0110 0100

 

 

[3.11]

초기 상태에서 어떤 레지스터에 '10110011'이 저장되어 있고 C 플래그의 값은 '1'이라고 하자

(1) RLC 연산을 수행한 결과를 쓰라

C(1) 1011 0011
RLC 수행 : C(1) 0110 0111

 

(2) (1)의 결과에 대하여 RRC 연산을 2번 연속 수행한 결과를 쓰라

C(1) 0110 0111
RRC 1번 수행 : C(1) 1011 0011
RRC 1번 수행 : C(1) 1101 1001

 

 

[3.12]

2의 보수로 표현된 아래의 수들에 대한 덧셈을 수행하고, 오버플로우가 발생하였는지 검사하라

(1) 100100 + 111010

  • C1, C2가 서로 다르기 때문에 오버플로우가 발생한다

 

(2) 11001100 + 10111010

  • C1, C2가 서로 동일하기 때문에 오버플로우가 발생하지 않는다

 

 

[3.13]

2의 보수로 표현된 아래의 수들에 대한 뺄셈을 수행하고, 오버플로우가 발생하였는지 검사하라

(1) 101100 - 101101

  • 101100 + (010011)

  • C1, C2가 서로 동일하기 때문에 오버플로우가 발생하지 않는다

 

(2) 11000010 - 01101000

  • 11000010 + (10011000)

  • C1, C2가 서로 다르기 때문에 오버플로우가 발생한다

 

 

[3.14]

8-bit 레지스터 R1에 '01110010'이 저장되어 있다. 아래 연산들이 수행된 후에 상태 플래그들 C, S, Z 및 V의 값은 각각 어떤 값으로 세트되는가? 단, 각 연산은 원래의 R1 내용에 대하여 수행하라

(1) R1과 11000110을 더한다

  • C 플래그 : 1
  • S 플래그 : 0
  • Z 플래그 : 0
  • V 플래그 : 1

 

(2) R1과 00011110을 더한다

  • C 플래그 : 0
  • S 플래그 : 1
  • Z 플래그 : 0
  • V 플래그 : 1

 

(3) R1과 10001101을 AND 연산한다

  • C 플래그 : 0
  • S 플래그 : 0
  • Z 플래그 : 1
  • V 플래그 : 0

 

(4) R1과 R1을 XOR 연산한다

  • C 플래그 : 0
  • S 플래그 : 0
  • Z 플래그 : 1
  • V 플래그 : 0

 

 

[3.15]

부호 없는 2진수들 간의 곱셈 (1001 × 0111)이 수행되는 과정을 그림 3-13과 같이 작성하라

사이클 C 플래그 A 레지스터 Q 레지스터 M 레지스터 과정 설명
초기 0 0000 0111 1001  
t(1) 0 0100 1011 1001 bit 1 검사
>> 1이므로 덧셈(A + M -> A) + 시프트(C->A->Q)
A + M = 0000 + 1001 = 1001
C->A->Q : 0 1001 0111 : 0 0100 1011
t(2) 0 0110 1101 1001 bit 1 검사
>> 1이므로 덧셈(A + M -> A) + 시프트(C->A->Q)
A + M = 0100 + 1001 = 1101
C->A->Q : 0 1101 1011 : 0 0110 1101
t(3) 0 0111 1110 1001 bit 1 검사
>> 1이므로 덧셈(A + M -> A) + 시프트(C->A->Q)
A + M = 0110 + 1001 = 1111
C->A->Q : 0 1111 1101 : 0 0111 1110
t(4) 0 0011 1111 1001 bit 0 검사
>> 0이므로 시프트(C->A->Q)
C->A->Q : 0 0111 1110 : 0 0011 1111
result 최종 결과 = 0011 1111 = 1 + 2 + 4 + 8 + 16 + 32 = 63

 

 

[3.16]

2의 보수로 표현된 5-bit 데이터 간의 곱셈 (10101 × 01101)이 Booth 알고리즘으로 수행되는 과정을 [예제 3-25]와 같이 작성하라

사이클 N M 레지스터 A 레지스터 Q 레지스터 Q` 과정 설명
초기 5 10101 00000 01101 0 <Q 레지스터의 최하위 bit, Q`을 보고 판단>
t(1) 4 10101 00101 10110 1 10
>> 뺄셈(A - M -> A) + 시프트(A->Q->Q`)
A - M = 00000 + 01011 = 01011
A->Q->Q` : 01011 01101 0 : 00101 10110 1
t(2) 3 10101 11101 01011 0 01
>> 덧셈(A + M -> A) + 시프트(A->Q->Q`)
A + M = 00101 + 10101 = 11010
A->Q->Q` : 11010 10110 1 : 11101 01011 0
t(3) 2 10101 00100 00101 1 10
>> 뺄셈(A - M -> A) + 시프트(A->Q->Q`)
A - M = 11101 + 01011 = 01000
A->Q->Q` : 01000 01011 0 : 00100 00101 1
t(4) 1 10101 00010 00010 1 11
>> 시프트(A->Q->Q`)
A->Q->Q` : 00100 00101 1 : 00010 00010 1
t(5) 0 10101 11011 10001   01
>> 덧셈(A + M -> A) + 시프트(A->Q->Q`)
A + M = 00010 + 10101 = 10111
A->Q->Q` : 10111 00010 1 : 11011 10001 0
result 최종 결과 = 1101110001 = -512 + (256 + 64 + 32 + 16 + 1) = -512 + 369 = -143

 

 

[3.17]

그림 3-12의 부호없는 2진수 곱셈기를 Booth 곱셈기로 변경하여 다시 그려라

사이클 N M 레지스터 A 레지스터 Q 레지스터 Q` 과정 설명
초기 4 1101 0000 1011 0 <Q 레지스터의 최하위 bit, Q`을 보고 판단>
t(1) 3 1101 0001 1101 1 10
>> 뺄셈(A - M -> A) + 시프트(A->Q->Q`)
A - M = 0000 + 0011 = 0011
A->Q->Q` : 0011 1011 0 : 0001 1101 1
t(2) 2 1101 0000 1110 1 11
>> 시프트(A->Q->Q`)
A->Q->Q` : 0001 1101 1 : 0000 1110 1
t(3) 1 1101 1110 1111 0 01
>> 덧셈(A + M -> A) + 시프트(A->Q->Q`)
A + M = 0000 + 1101 = 1101
A->Q->Q` : 1101 1110 1 : 1110 1111 0
t(4) 0 1101 0000 1111 1 10
>> 뺄셈(A - M -> A) + 시프트(A->Q->Q`)
A - M = 1110 + 0011 = 0001
A->Q->Q` : 0001 1111 0 : 0000 1111 1
result 최종결과 = 00001111 = 15

 

 

 

[3.18]

바이어스가 127인 지수를 사용하는 부동소수점 형식에서 지수 필드의 값이 다음과 같을 때, 실제 지수값을 10진수로 쓰라

(1) 11111110

1111 1110 - 0111 1111 = 1111 1110 + 1000 0001 = 0111 1111 = 127

>> 실제 지수값 = 127

 

(2) 01111111

0111 1111 + 1000 0001 = 0000 0000 = 0

>> 실제 지수값 = 0

 

(3) 10110101

1011 0101 + 1000 0001 = 0011 0110 = 54

>> 실제 지수값 = 54

 

(4) 00101101

0010 1101 + 1000 0001 = 1010 1110 = -128 + (32 + 8 + 4 + 2) = -128 + 46 = -82

>> 실제 지수값 = -82

 

 

[3.19]

부동소수점 표현에 관한 아래 물음에 답하라

(1) 바이어스 128을 사용하는 32-bit 부동소수점 형식으로 10진수 -1.625를 나타내라. 단, 지수 필드는 8bit이고, 가수 필드는 정규화된다

1.625 = 1.101 = 0.1101 × 2^(1)

부호(s) 필드 = 1
지수(E) 필드 = 1 + 128(바이어스) = 1000 0001
가수(M) 필드 = 101 0000 0000 0000 0000 0000
부호(S) 필드 지수(E) 필드 가수(M) 필드
1 1000 0001 101 0000 0000 0000 0000 0000

 

(2) 위의 (1)번을 지수 필드가 9bit이고 바이어스가 256인 64-bit 부동소수점 형식에 대하여 다시 풀어라

1.625 = 1.101 = 0.1101 × 2^(1)

부호(s) 필드 = 1
지수(E) 필드 = 1 + 256(바이어스) = 1 0000 0001
가수(M) 필드 = 101 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000
부호(S) 필드 지수(E) 필드 가수(M) 필드
1 1 0000 0001 101 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 000

 

 

[3.20]

아래의 10진수들을 IEEE 754 표준 32-bit 부동소수점 형식으로 표현하라

  • IEEE 754 표준 32-bit 부동소수점 바이어스 = 127 / 부호화-크기 표현 사용

(1) 5

5 = 101
>> 1.01 × 2^(2)

부호(S) 필드 : 0
지수(E) 필드 : 2 + 127 = 0000 0010 + 0111 1111 = 1000 0001
가수(M) 필드 : 01 0000 0000 0000 0000 0000 0000 0000 00
부호(S) 필드 지수(E) 필드 가수(M) 필드
0 1000 0001 01 0000 0000 0000 0000 0000 0000 0000 00

 

(2) 253.25

253.25 = 11111101.01
>> 1.111110101 × 2^(7)

부호(S) 필드 : 0
지수(E) 필드 : 7 + 127 = 0000 0111 + 0111 1111 = 1000 0110
가수(M) 필드 : 11111 0101 0000 0000 0000 0000 0000 000
부호(S) 필드 지수(E) 필드 가수(M) 필드
0 1000 0110 11111 0101 0000 0000 0000 0000 0000 000

 

(3) -1.625

1.625 = 1.101
>> 1.101 × 2^(0)

부호(S) 필드 : 1
지수(E) 필드 : 0 + 127 = 0111 1111
가수(M) 필드 : 101 0000 0000 0000 0000 0000 0000 0000 0
부호(S) 필드 지수(E) 필드 가수(M) 필드
1 0111 1111 101 0000 0000 0000 0000 0000 0000 0000 0

 

(4) -1/32

-1/32 = 0.00001
>> 1 × 2^(-5)

부호(S) 필드 : 1
지수(E) 필드 : -5 + 127 = 0111 1010
가수(M) 필드 : 0000 0000 0000 0000 0000 0000 0000 0000
부호(S) 필드 지수(E) 필드 가수(M) 필드
1 0111 1010 0000 0000 0000 0000 0000 0000 0000 0000

 

 

[3.21]

IEEE 754 표준 32-bit 부동소수점 형식으로 표현된 비트 패턴이 다음과 같을 때, 각각에 대한 10진수를 구하라

(1) 0 10000011 10100000000000000000000

부호(S) 비트 = 0 >> 양수

지수(E) 필드 : 1000 0011 = 131
>> 실제 지수값 = 131 - 127 = 4

가수(M) 필드 : 101

>> 실제 값 = 1.101 × 2^(4) = 11010 = 26

 

(2) 1 01111100 01101000000000000000000

부호(S) 비트 = 1 >> 양수

지수(E) 필드 : 0111 1100 = 124
>> 실제 지수값 = 124 - 127 = -3

가수(M) 필드 : 01101

>> 실제 값 = 1.01101 × 2^(-3) = 0.00101101 = -0.17578125

 

(3) 1 11010101 11010100000000000000000

부호(S) 비트 = 1

지수(E) 필드 : 1101 0101 = 213
>> 실제 지수값 = 213 - 127 = 86

가수(M) 필드 : 110101

>> 실제 값 = 1.110101 × 2^(86) = 2^(86)(1.828125) = -1.41444320895e+26

 

(4) 0 11111111 01100000000000000000000

부호(S) 비트 = 0

지수(E) 필드 : 1111 1111 = 255
>> 실제 지수값 = 255 - 127 = 128

가수(M) 필드 : 011

>> 실제 값 = 1.011 × 2^(128) = 2^(128)(1.375) ---- NaN

 

(5) 0 00000000 01100000000000000000000

부호(S) 비트 = 0

지수(E) 필드 : 0000 0000 = 0
>> 실제 지수값 = 0 - 127 = -127

가수(M) 필드 : 011

>> 실제 값 = 1.011 × 2^(-127) = 2^(-127)(0.375) = 4.40810381558e-39

 

 

[3.22]

그림 3-17의 부동소수점 표현으로는 '0'을 나타낼 수 없는 이유를 설명하라. 또한, IEEE 754 표준 32-bit 부동소수점 형식에서의 '0'에 대한 비트 패턴을 표시하라

가수(M)필드의 첫 번째 bit는 반드시 '1'이여야 하기 때문이다

IEEE 754 표준 32-bit 부동소수점 형식에서의 '0'에 대한 비트 패턴
>> 0 01111111 00000000000000000000000000000000

 

 

[3.23]

아래의 부동소수점 산술 연산들을 수행하라. 단, 연산을 수행한 후에는 반올림을 이용하여 결과값의 소수점 아래 6자리까지만 남기도록 하라.

(1) (0.111001 × 2-5) + (0.100111 × 2-3)

0.111001 × 2^(-5) >> 0.001110 × 2^(-3)

0.001110 + 0.100111 = 0.110101

>> result : 0.110101 × 2^(-3)

 

(2) (0.100011 × 26) - (0.111001 × 23)

0.111001 × 2^(3) >> 0.000111 × 2^(6)

0.100011 - 0.000111 = 0.100011 + 1.111000 = 0.011100

>> result : 0.011100 × 2^(6)

 

(3) (0.1001 × 28) × (0.1011 × 212)

가수 곱 : 1001 × 1011 = 0110 0011
지수 합 : 8 + 12 = 20

>> result : 0.01100011 × 2^(20)

 

 

[3.24]

컴퓨터에서는 데이터의 길이가 제한되어 있기 때문에 부동소수점 표현은 몇몇 수들만 정확하게 표현할 수 있을 뿐이고, 다른 수들은 근사치로 나타낸다. 만약 'A'을 실제 값 A의 근사치라고 한다면, 상대적 오차(relative error) r은 다음과 같이 표현된다

(1) A = 1.427일 때, A를 1.42로 절삭한 경우와 1.43으로 반올림한 경우의 상대적 오차를 각각 구하라

A를 1.42로 절삭한 경우 : r = (1.427-1.42)/1.427 = 0.490539%
A를 1.43로 반올림한 경우 : r = (1.427-1.43)/1.427 = -0.210231%

 

(2) 문제 3.23의 각 연산 결과에 대한 상대적 오차를 구하라

3.23 - (1) : 0.103516
3.23 - (1) 실제 계산 값 : 0.10400390625
>> r = (0.10400390625 - 0.103516)/0.10400390625 = 0.048791%

3.23 - (2) : 28
3.23 - (2) 실제 계산 값 : 27.875
>> r = (27.875 - 28)/27.875 = -0.448430%

3.23 - (3) : 405504
3.23 - (3) 실제 계산 값 : 405504
>> r = 0 (오차 X)