연산자 중에 대부분은 알겠지만 특히 비트 연산자가 좀 까다롭긴 하다.
우선 비트라 하면 “on”/”off”, 즉 1 혹은 0의 값을 가지는데 모든 숫자와 문자를 2진 코드화 한 숫자라 하겠다.
2진법은 뭐 다들 초등교육 때 다들 알 것이라 본다.
| 2진법(비트) | 10진법 |
| 0 | 0 |
| 1 | 1 |
| 10 | 2 |
| 11 | 3 |
| 100 | 4 |
| 101 | 5 |
| 110 | 6 |
| 111 | 7 |
| 1000 | 8 |
| 1001 | 9 |
| 1010 | 10 |
| ... |
즉 비트 연산자는 우리가 일반적으로 쓰는 10진법을 2진법으로 코드화하여 계산하면 되는 것이다.
| << | 좌측 이동 |
| >> | 기호 있는 우측 이동 |
| >>> | 기호 없는 우측 이동 |
| & | 비트의 AND 합 |
| ^ | 비트의 XOR 합 |
| | | 비트의 OR 합 |
대부분의 교재가 이런 식으로 나와 있는데 예를 들어 보겠습니다.
숫자 14(2진수—> 1110)를 가지고 위의 3개의 비트 이동 연산자를 써 보겠다.
14<<2 : 결과값 ---- 56(2진수-->111000)
왼쪽으로 비트가 2칸 증가하면서 자연 뒷 부분엔 00이 추가 되었다. 위의 2진 코드(111000)을 10진수로 변환하면 56이 나옴.
14>>2 : 결과값 ---- 3(2진수-->11)
오른쪽으로 비트가 2칸 감소하면서 자연 뒷 부분(10)은 짤렸다. 10진수로 변환하면 해당 값이 나옴. (양수의 비트 연산자는 0이하의 값은 안 나온다.)
tip.
소수점의 숫자에 대한 비트 연산자는 소숫점 이하는 버림하고 일반 정수와 동일한 값이 나오게 됩니다. 그리고 1.0이하의 숫자(음수 제외) 비트 연산자의 결과값은 항상 0이 될 수 밖에 없겠지요.(소수점의 2진법 표기에 대한 선 지식을 수행하길 바란다.)
또한 음수에 대한 비트 연산이 있다. 음수에 대한 것은 – 기호만 앞에 부쳐 주고 연산은 양수와 동일하다. 단 -1이 최대값이 된다.(더 이상 올라갈 수가 없다.)
14>>>2: 결과값 --- 3
위와 마찬 가지로 양수이면 동일한 결과값을 얻을 수 있다.
tip.
만약 음수에 대한 unsigned right shift(부호 없는 비트 연산)를 쓰게 된다면 어떤 일이 발생할까?
여기엔 음수 영역에 대한 보수의 개념이 들어간다.
즉 음수에 이 비트 연산을 쓰게 된다면 보수로 전환이 되고 그때부터 오른쪽으로 밀려나간다고 생각하면 되고 밀려나간 왼쪽 비트 단위엔 0 값이 된다는 것이다.
아래 그림에는 그림에는 –1,-5,-10을 돌려보았다.
아래 2개의 그림은 위의 과정 중 참조 사항이다.
2의 n승에 대한 차트

각 –1,-5,-10에 대한 >>>n 연산 결과 값
(data type은 int(32bit)를 바탕으로 산출)

위의 해당 결과 값에 대한 코드 처리 부분
//각 숫자에 대한 ">>>" 연산 결과값 산술 처리 var num:int=-10; for(var i:Number=0;i<33;i++) trace(num>>>i);// 2의 N승 산술 처리 var totalNum:Number=1; for(var i:Number=32;i>0;i--) trace(totalNum=totalNum*2);
// 2의 N승 검별 처리 var num:Number=16; for(var i:Number=1;i<1000;i++){ trace("[process]: "+num); num=num/2; if(num==1){ trace("2의 "+i+"승"); return; }else if(num<1){ trace("2의 배수가 아님"+"[2의 "+(i-1)+"승 이상]"); return; } }
숫자 14(2진수-->1110)과 7(111)을 가지고 아래의 3개의 비트 결합 연산자를 써 보겠다.
14&7 : 결과값 ---- 6(2진수-->110)
1110
& 111 1&1 –>1 , 0&0 –>1, 0&1 –>0, 0&0->0을 연산, 즉 비트가 서로 같으면 true.
-----
0110 --> 맨 앞의 0을 제외하고 110 즉 10진법 숫자 6을 가리킨다.
14|7: 결과값 ---- 15(2진수-->1111)
1110
| 111 0|0 –>0을 제외하고 비트 값이 1이 들어있으면 true.
-----
1111
14^7: 결과값 ---- 9(2진수-->1001)
1110
^ 111 1^1->0, 0^0->0을 제외하고 둘의 비트가 틀려야 true.
-----
1001
더욱 자세한 내용은 아래 사이트에서 참조하길 바란다.






