[1004] replaceByte 문제 해결
x>y의 식이 참일때 1을 return하고, 거짓일 때 0을 return 한다, 라는 문제를 해결했다.
우선, 이 조건을 만족하는 것인지 아닌지를 판별하기 위해서는 x-y>0 이라는 조건을 만족해야 참이 되는 것을 알 수 있다. 단, 이러한 조건이 성립하는 데에는 두 수가 '양수'라는 조건 아래 허용되며, 또한 두 수의 부호비트가 둘 다 양수더라도 오버플로우에 대한 우려가 발생한다. 그렇기 때문에 이에 대한 부분은 카노맵을 그려 아래와 같이 해결하였다.
카노맵을 그릴 때에는 각각의 부호비트를 기준으로 하였다.
기본적으로 인자로 받은 x와 y값의 부호비트를 32비트 기준이므로 31만큼 쉬프트를 하여 원하는 자리의 부호비트만을 구하도록 하였다. 또한 앞서 말한 조건으로 x-y인 점을 기준으로 보야아 한다고 했으므로 이 조건을 A라고 두었고, x-y만을 가지고 한다면 만약 y가 최솟값일 경우, (1000의 보수는 1000) 보수를 취해도 음수가 그대로 나오게 되므로 부호 비트는 그대로 음수 + 음수가 되므로 문제가 발생할 수 있다. 그렇기 때문에 y-x의 경우(B라고 놓았다.) 도 고려를 하여 카노맵을 그려보았다.
카노맵을 그리는 자세한 과정 중, 예시를 하나만 들어보겠다.
조건은 x의 부호비트/ y의 부호비트/ (A)x-y의 부호비트/ (B)y-x의 부호비트이다.
만약, x의 부호비트가 0, 즉 양수이고 y의 부호비트가 양수일 경우, A는 양수의 결과가, B는 음수의 결과가 나왔다.
이것을 식으로 간단히 표현해보자면,
x - y = +
y - x = -
이라고 할 때 x-y의 식에서 +의 부호가 나온다면, x의 값이 더 큰 것이고 y-x의 식에서 -의 기호가 나온다면 마찬가지로 x의 값이 더 큰것이라고 볼 수 있다. 그리해서 결과값으로 나오는 z는 1이 되게 된다.
이외에도 예외 상황이 있다. 만약 x의 부호가 양수고, y의 부호가 음수일 경우에는 무조건 결과가 1로 나올 것이니 카노맵을 구하는 과정에서 x는 0, y는 1인 부분의 결과값을 1로 채우고, 그 반대로 x가 음수, y가 양수인 경우에는 어떤 경우에도 결과가 성립이 될 수 없으므로 0을 채워둔다.
이렇게 해서 나온 결과값에 대한 카노맵은 아래와 같다.
위의 카노맵이 나온대로 식을 간소화하면
이러한 결과를 도출해낼 수 있다. 식을 도출해낸 뒤에 각각의 A, B, X, Y에 대한 부호비트를 구하여 위의 식과 같이 계산을 진행했다. 그러나, 결과는 1과 0만을 도출해야 하는데, 위의 식에서 >>31로 쉬프트를 해버리게 되면 만약 부호비트가 1일 경우 1111..이 되어 의도했던 0000..1의 결과를 얻기 힘들다. 그러므로, 우리가 원하는 값을 얻기 위해서는 마지막 비트만을 얻어야 하므로, 마지막에 1을 식의 결과값과 AND를 해준다. 그렇게 하면 원하는 결과를 도출할 수 있게 된다.
'Undergraduate Records' 카테고리의 다른 글
[1008] UML대로 구현하기 (0) | 2019.10.08 |
---|---|
[1007] CountingSort(계수정렬), HeapSort(힙정렬) (1) | 2019.10.07 |
[1001] DataLab 문제 해결 보고서 (0) | 2019.10.02 |
[0930] 시스템 프로그래밍 DataLab 5문제 (0) | 2019.10.01 |
[0927] Merge Sort & Quick Sort와 시간 복잡도 (1) | 2019.09.27 |