2020-09-08
1의 보수
1의 보수란 어떤 수를 커다란 2의 거듭제곱수-1에서 빼서 얻은 이진수이다.
또는 비트를 반전시켜 얻을수 있다.
1의 보수는 대부분의 산술연산에서 원래 숫자의 음수처럼 취급된다.
주어진 이진수와 자리수가 같고
모든 자리가 1인 수에서 주어진 수를 빼서 얻은 수가 1의 보수이다.
혹은 주어진 이진수의 모든 자리의 숫자를 반전(0을 1로, 1을 0으로)시키면
1의 보수를 얻을 수 있다.
2의 보수
2의 보수(--補數, 영어: two's complement)란 어떤 수를
커다란 2의 제곱수에서 빼서 얻은 이진수이다.
2의 보수는 대부분의 산술연산에서 원래 숫자의 음수처럼 취급된다.
주어진 이진수보다 한 자리 높고
가장 높은 자리가 1이며 나머지가 0인 수에서 주어진 수를 빼서 얻은 수가 2의 보수이다.
혹은 주어진 이진수의 모든 자리의 숫자를 반전(0을 1로, 1을 0으로)시킨 뒤
여기에 1을 더하면 2의 보수를 얻을 수 있다.
출처: 위키피디아
소스코드
※ 1의 보수 공식
입력받은 이진수 값을 모두 반대로 바꾸어주면 된다.
1이면 0으로 0이면 1로 바꾸면 되는데 코드 상으로 표현하면
1 - (해당 위치의 이진수 값) = x 가 될 것이다.
※ 2의 보수 공식
변경된 1의 보수 값에 마지막 뒷자리에 1 자리올림을 해주어야 한다.
때문에 carry 라는 자리 올림변수에 1을 선언해 주고,
기존 1의 보수 배열(bo1[n])에 있는 값과 곱해주어 1이 되면 자리올림이 발생한 것이고
곱해주어 0이 되면 더이상의 자리올림은 없기 때문에
기존 값이 bo2[n]에[ 그대로 저장된다.
int [] arr = {1, 1, 0, 0, 1};
int [] bo1 = new int [5];
//1의 보수가 저장될 배열
int [] bo2 = new int [5];
//2의 보수가 저장될 배열
int i = 0;
do {
bo1[i] = 1 - arr[i];
//1에서 기존 배열의 값을 빼준면 보수가 된다.
i++;
}while(i < 5);
//1 의 보수의 값은 모두 저장되었다.
int carry = 1;
//자리 올림이 발생을 고려한 변수
//2의 보수는 1의 보수맨 뒷자리에서 1을 더해주어야 하기 때문에 필요
i = 4;
//끝자리부터 올리기 때문에
//시작 위치는 배열의 마지막 위치로 지정
do{
bo2[i] = bo1[i] + carry;
bo2[i] = bo2[i] % 2;
carry = bo1[i] * carry;
//0이면 더이상 자리 올림을 할 필요가 없다.
i--;
}while(i > 0);
---아래는 출력문 ----
for(int j =0; j < 5; j++) {
System.out.print(bo1[j] + " ");
}
System.out.println();
for(int j =0; j < 5; j++) {
System.out.print(bo2[j] + " ");
}