[java] 비트의 음수 표현과 shift 연산자

문돌이 개발자·2023년 3월 4일

Shift 연산

왼쪽 시프트 연산자(<<)는 비트를 왼쪽으로 이동시키는 연산자로 이동시킨 빈 자리는 0으로 채워지며 만약 비트범위를 벗어나게 되면 사라진다(데이터 손실 발생).
데이터 손실이 일어나지 않고 양수라면 x << n 은 x에 2^n을 곱한 것과 같다.

ex) 0010 << 1 => 0100, 1010 << 1 => 0100

오른쪽 시프트 연산자(>>)는 비트를 오른쪽으로 이동시키는 연산자로 이동시킨 빈 자리는 부호 비트와 같은 값으로 채워진다. 양수인 경우 0으로, 음수인 경우 1로 채워진다. <<와 마찬가지로 비트범위를 벗어나게 되면 사라집니다.
데이터 손실이 일어나지 않고 양수라면 x >> n 은 x를 2^n로 나눈 것과 같다.

 ex) 01000 >> 1 => 00100, 00111 >> 2 => 00001, 10111 >> 2 => 11101

비트의 음수표현

2진수로 음수를 표현하는 방법에는 부호 및 크기 방식, 1진 보수방식, 2진 보수방식의 3가지가 있다. 3가지 방법의 공통점은 최상위 비트(가장 좌측의 비트)를 부호를 표현하는 비트로 사용한다는 점이다. 0이면 양수, 1이면 음수를 나타낸다.

1. 부호 및 크기 방식

최상위 비트는 부호를, 나머지 비트는 크기를 나타내는 방식이다. 001001 = 9, 101001 = -9 와 같이 최상위 비트는 부호를 표현하는 수단으로만 사용한다. 하지만 이 방법은 0의 두가지 표현방식이 나오며 비트 연산의 어려움이 있다.

 001001(9) + 101001(-9) = 110010(-18) //연산이 제대로 되지 않는다.


2. 1진 보수방법

1의 보수는 어떤수를 2^n-1로 만들어 주는 수로 이진수에서 모든 비트의 숫자를 반전시키면 얻을 수 있다.(반전시킨 둘을 더하면 모든 비트가 1로 채워진 2^n-1인 수가 되기 때문에) 이 방법은 비트 연산을 가능하게 하지만 역시 0의 표현 방식이 두가지가 나온다.


3. 2진 보수방법

2의 보수는 어떤 수를 2^n으로 만들어 주는 수로 1의 보수를 취한 후에 1을 더해주면 얻을 수 있다.

0을 0000 하나의 방법으로 표현할 수 있게 되며 비트 연산도 가능한 장점이 있다. 대부분의 프로그래밍 언어는 2의 보수방법을 취하고 있다.


참고:

Representation of Negative Binary Numbers - GeeksforGeeks

[Chapter 2 연산자] 6. 비트 연산자 - 시프트 연산자 (Shift Operator)

LSB와 MSB란 무엇인가?

profile
까먹고 다시 보려고 남기는 기록

0개의 댓글