IT_Programming/JavaScript

자바스크립트 완벽가이드 - 5.8 비트 단위 연산자

JJun ™ 2010. 7. 4. 19:52


자바스크립트의 모든 숫자는 부동소수점 숫자이지만, 비트 단위 연산자는 정수값 피연산자를 요구한다.

비트 단위 연산자가 작용하는 것은 이 정수 연산자에 해당하는 부동소수점 표현법이 아니라 32비트 정수

표현법이다. 비트 단우 ㅣ연산자들 중 네 종류(&, |, ^, ~)는 피연산자의 개별 비트에 대해 불리언 대수를

수행한다.

 

즉, 각 피연산자를 구성하는 각 비트가 마치 불리언 값인 것처럼 다루어서 앞에 소개된 논리 연산자와 비슷한 연산을 수행하는 것이다. 다른 세 종류의 비트 단위 연산자(<<, >>, >>>)들은 왼쪽이나 오른쪽으로 비트를 이동할 때 사용된다.


비트 단위 연산자의 피연산자가 정수가 아니거나 32비트 정수 표현법으로 표현하기에 너무 큰 경우, 그저 간단히 피연산자의 소수점 이하를 버리거나 32번째 너머의 비트를 잘라내어 강제로 피연산자를 32비트로 만든다. 이동 연산자(shift operator)의 우변 피연산자는 0과 31 사이의 값이어야 한다. 이동 연산자는 이 피 연산자를 32비트 정수로 변환한 후 여섯 번째 이상의 비트를 버림으로써 이 숫자가 적절한 범위에 들게 한다.


만일 여러분이 2진수에 익숙하지 않거나 10진수 정수를 2진수로 표현하는 것에 익숙하지 않다면 이 절에서

설명하는 연산자들을 건너뛰어도 좋다. 여기서 설명하는 것은 이 연산자들의 목적이 아니다. 이 연산자들은

 2진수를 저수준에서 조작하는데 필요한 것이며 자바스크립트 프로그램에서 그다지 널리 쓰이지 않는다.

비트 단위 연산자들은 다음과 같다.

 

비트 단위 AND(&)
& 연산자는 두 정수 피연산자들의 개별 비트끼리 불리언 AND 연산을 수행한다. 동일 위치의 비트가 두 피연산자에서 모두 설정되어 있어야만 결과값의 해당 위치 비트도 설정된다. 예를 들어 0x1234 & 0x00FF의 결과는 0x0034다.

 

비트 단위 OR(|)
| 연산자는 두 정수 피연산자들의 개별 비트끼리 불리언 OR 연산을 수행한다. 적어도 하나 이상의 피연산자에서 어떤 위치의 비트가 설정되어 있으면 결과값의 해당 위치 비트도 설정된다. 예를 들어 9 | 10의 결과는 11이다.

 

비트 단위 XOR(^)
^ 연산자는 두 정수 피연산자들의 개별 비트끼리 배타적 OR (XOR) 연산을 수행한다. 배타적 OR란 두 연산자 중 하나가 true이지만 둘 다 true는 아니라는 것이다. 두 피연산자 중 하나에서만 어떤 비트가 설정되어 있으면 결과값의 해당 위치 비트도 설정된다. 예를 들어 9 ^ 10의 결과는 3이다.

 

비트 단위 NOT(~)
~ 연산자는 단항 연산자로 단일 정수 피연산자의 앞에 위치한다. ~ 연산자는 피연산자의 모든 비트를 반전시킨다. 자바스크립트에서 부호 있는 정수를 표현하는 방법으로 인하여, 어떤 값에 ~ 연산자를 적용하는 것은 그 값의 부호를 바꾸고 1을 빼는 것과 같은 결과를 얻게 된다. 예를 들어 ~0x0f는 0xfffffff0이며 이는 -16과 같다.

 

왼쪽으로 이동(<<)
<< 연산자는 첫 번째 피연산자의 모든 비트를 두 번째 피연산자에서 지정된 자릿수 만큼 이동시킨다. 두 번째 피연산자는 반드시 0과 31 사이의 정수여야 한다. 예를 들어 a << 1 연산의 경우 a의 첫 번째 비트는 두 번째 비트가 되고, 두 번째 비트는 세 번째 비트가 되고 ...... 이 과정이 이어진다. 모든 비트를 이동시키고 나면 첫 번째 비트를 새로 만들어야 하는데 이는 0이 사용되며, 원래 있던 32번째 비트는 잃어버리게 된다.어떤 값을 왼쪽으로 1자리 이동시키는 것은 이 값이 2를 곱하는 것과 같으며, 2자리 이동시키는 것은 4를 곱하는 것과 같다. 예를 들어 7 << 1의 결과는 14다.

 

부호를 보존하면서 오른쪽으로 이동 (>>)
>> 연산자는 첫 번째 피연산자의 모든 비트를 두 번째 피연산자에서 지정된 자릿수 만큼 이동시킨다. 두 번째 피연산자는 반드시 0과 31 사이의 정수여야 한다. 오른쪽 가장자리 밖으로 이동되는 비트는 잃어버리게 된다. 왼쪽 가장자리부터 새로 채워지는 비트는 원래 피연산자의 부호 비트를 따른다. 이는 결과의 부호를 원래의 부호와 같도록 보존하기 위함이다. 첫 번째 피연산자가 양수라면 결과값의 상위 비트들에는 0이 위치한다. 첫 번째 피연산자가 음수라면 결과값의 상위 비트들에는 1이 위치한다. 어떤 값을 오른쪽으로 한 자리 이동시키는 것은 이 값을 2로 나누는 것과 같으며(나눗셈의 나머지는 무시한다), 두 자리 이동시키는 것은 4로 나누는 것과 같다. 예를 들어 7 >> 1의 결과는 -4다.

 

0으로 채우면서 오른쪽으로 이동(>>>)
>>> 연산자는 >> 연산자와 한 가지를 제외하고는 똑같다. 그 차이점은, 왼쪽 가장자리부터 새로 이동해 들어오는 비트는 첫 번째 피연산자의 부호에 관계없이 무조건 0이라는 것이다. 예를 들어 -1 >> 4의 결과는 -1이지만, -1 >>> 4의 결과는 268435455다. (0x0fffffff).