Algorithm|Data Structure

2진수

msvscode 2021. 5. 21. 14:30

*2진수의 특징

1)2진수의 최상의 자리수의 값은 항상 그 전의 자리수 값들의 합보다 1이 더 크다
->2배의 특성으로 처음에 1과 그다음 자리 2의 차이인 1의 값이 계속 유지된 결과이다

2)값을 표현하는 비트 들 중 최상위 비트를 MSB라 하는데 이 MSB가 1일 경우는 그 자리 비트수에 해당하는 값에 '음'의 부호를 가진다 0일 경우에는 그 자리 비트수에 아무런 값에 영향을 미치지 않으므로 아무런 의미가 없다
결국 MSB를 사용할 경우는 음의 부호를 사용하겠다는 말이다

양의 정수를 음의 정수로 변환 하는 방법은 결론만 말하자면 보수를 취해주고 1을 더해준다

이의 원리는 다음과 같다 지금 부터 설명을 8비트로 표현 하겠다

우리가 1을 8비트로 표현할 경우 00000001로 표현 한다 이를 음수로 표현 하려면 어떻게 해야할까? 1)과 2)의 성질을 이용하면 알 수 있다. 8비트에서 최상위 자리의 값은 128을 갖는다. 여기서 2)의 특성으로 인해 10000000는 -128이 된다 여기에 양수 127을 더해주면 -1을 만들 수 있는것이다. 1)의 특성으로 인해 01111111은 127이다  따라서
10000000 + 01111111 은 -128 + 127 과 같고 이는 -1이 된다. 근데 문제는 매번 달라진 음의 수를 구하고 싶어질때마다 양의 정수로 표현 해야할 부분을 한번에 알아내기 어렵다는 것이다. 예를 들어 -4를 구하고 싶을때는 -128 + 124를 하면 되는데 이 124를 8비트로 표현 해야 할때 시간이 걸린 다는 것이다. 이를 해결하기 위해 양의 정수에 1의 보수를 이용해주고 1을 더해주면 쉽게 구할 수 있다. (1의 보수를 적용하는것은 각 비트의 값이 1이면 0으로 0이면 1로 바꾸어 주는것이다.) 이는 어떤 점에 착안한 내용이냐면 우리는 일단 음수를 나타내기 위해서는 음의 값을 가질수 있는 MSB를 이용할 수밖에 없는데 양의 정수는 항상 MSB가 0이므로 1의보수를 취해주면 1이 된다 따라서 무조건 -128이라는 값을 얻게 된다. 그 뒤에 생각해 볼 부분은 -128(10000000)에 양의 정수를 표현해서 더해 줄 나머지 7비트를 어떻게 빠르게 구할 수 있느냐는 것이다. 이는 다음과 같은 원리로 구할 수 있다. 내가 만약 -4를 구하고 싶다면 -10 + 6(왼쪽 음의 정수와 똑같은 10에서 4를 뺀 값)을 하면 -4를 구할 수 있듯이  MSB 즉 -128 + 124를 (왼쪽 음의 정수와 똑같은 128에서 4를 뺀 값)하면 - 4가 나온다 이때 124는 나머지 7비트로 아주 쉽게 나타낼 수 있다. 7비트로 나타낼 수 있는 최대값은 1111111로 127이다 원래 양의 정수 4는 0000100로 나타낼 수 있고 이를 1의 보수를 취하면 1111011이 되는데 이는 딱 진짜 127에서 4만 빠진 값으로 123이 되고 여기서 1을 더해주면 124가 되므로 최종적으로 1111100이 되고 -128 + 124 의 형태는 11111100 으로 원했던 -4의 2진수 표현법을 구할 수 있게 된다.

그래서 음의 정수를 구할때는 해당 양의 정수에 1의 보수를 취한뒤 1을 더해주는것이다.(이 모든 과정을 2의 보수법이라한다)

'Algorithm|Data Structure' 카테고리의 다른 글

어떤 숫자에 0부터 1사이의 랜덤한 값을 곱했을때  (0) 2021.07.06
자료구조와 알고리즘  (0) 2021.06.25
PS팁  (0) 2021.05.21