제목 | 답변완료 2진법관련해서 문의 드립니다. | ||
---|---|---|---|
질문유형 | 강좌내용 | 교수님 | 권준표 |
과목 | 매트랩 | 강좌명 | |
작성자 | 학* (p******2) | 등록일 | 2017-03-27 21:24 |
궁금한것이 음수를 이진법으로 나타내려면 2의 보수법을 사용해야 한다는데 그 방법을 잘 모르겠습니다. 답변 완료된 질문과 답변은 수정 및 삭제가 불가합니다. |
- 댓글
- 0
인터넷에 쉽게 설명해 둔 글이 있어 전해드립니다.
○ 개념
보수는 뺄셈을 덧셈으로 계산할 때 사용합니다.
예를 들어보자면,
80 - 48이라는 식이 있다고 했을 때, 48의 10의 보수는 52.
80 + 52 = 132이고요, 여기서 삐져나온 자릿수 100을 빼면 32가 됩니다.
어떤가요? 뺄셈을 덧셈해도 뺄셈 계산이 되지요?
컴퓨터 CPU에서는 이러한 방식으로 뺄셈을 2의 보수를 취해서 덧셈으로 계산합니다.
○ 공식
진법은 2진법, 8진법, 10진법, 16진법 등이 있지요?
모든 진법에는 2가지의 보수가 존재하는데, 만약 R진법이라면 R의 보수와 R-1의 보수가 존재합니다.
즉 10진법에는 10의 보수와 9의 보수가 존재하고, 2진법에는 2의 보수와 1의 보수가 존재하겠지요.
이러한 보수를 구하는 공식은 다음과 같습니다.
R진법 N자릿수 X의 R의 보수: R의 N승 - X
R진법 N자릿수 X의 R-1의 보수: R의 N승 - 1 - X
즉, 10진수 567의 9의 보수는, 10의 3승 - 1 - 567 = 999 - 567 = 432가 됩니다.
10의 보수는 공식에 의하면, 이전 보수(9의 보수)에서 +1을 취하면 되겠지요, 즉 433이 됩니다.
(이처럼 R-1의 보수를 구했다면, R의 보수는 R-1의 보수에서 +1만 하면 되니 참 쉽지요?)
그냥 간단하게 생각하시면 됩니다.
10진수 567의 9의 보수는, 567을 999로 만드는 숫자입니다.
마찬가지로, 8진수 742의 7의 보수는, 742를 777로 만드는 숫자입니다.
○ 1의 보수
2진법의 1의 보수는 조금 특별합니다.
그냥 비트 전체를 반전시키면 1의 보수가 됩니다.
EX) 2진수 00110010의 1의 보수는 -> 11001101
○ 2의 보수
2의 보수는 1의 보수에서 +1을 하면 되지만, 더 쉽게 구할 수도 있습니다.
그냥 비트의 최하위 비트(LSB, 가장 오른쪽 비트)에서부터 1을 만날 때까지 그대로 쓰고, 1 뒤에부터는 반전하여 쓰면 됩니다.
EX) 2진수 11010010의 1의 보수는 00101101, 여기에 1을 더하면? 00101110
EX) 2진수 11010010의 2의 보수는 0 -> 10 -> 1을 만났으니까 나머진 역으로, 00101110
○ 매틀랩에서 2의 보수를 구하는 함수
- 예제를 아래 적어드리니, 한 번 분석해 보셔요~
%% 2의 보수
% a = matrix 형태로 된 binary 값
% factor = scale factor , 기본은 `1`
function value = twocomp (a ,factor)
% MSB(a(1), 최상위비트)가 0일 때 양수 이므로 그대로 10진수로 변환
if a(1) == 0
value = sum( a .* 2.^[ factor+length(a)-1 : -1 : factor ])
% MSB(a(1), 최상위비트)가 1일 때 음수
% 1의 보수를 취한 후 1을 더하고 음수를 취함.
else
a = (1 - a ) ;
a(length(a)) = a(length(a)) + 1 ;
a(1) = [] ;
value = - sum( a .* 2.^[ factor+length(a)-1 : -1 : factor ])
end
end
- 2017-03-28
- 2024-12-12 수정