sitelink1 http://blog.naver.com/tomatoalive?Redire...0116358702 
sitelink2  
sitelink3  
sitelink4 http://1 
extra_vars4 ko 
extra_vars5  
extra_vars6 sitelink1 
자바스크립트에서 숫자형은 크기를 지정할 수가 없습니다. 8bit char 형 이라던가 32bit int 형 이라던가 하는것들 말입니다. 개발자 입장에서는 잘 쓰면 그만인 것이지만 조금만 자세히 들여다 보면 여간 신기한 것이 아닙니다. 그것은 바로 음수 때문인데요, 잘 아시는 바와 같이 signed char 의 첫번째 Bit 는 숫자의 부호를 뜻하며 1이면 음수이고 0이면 양수입니다.
 
자 그렇다면... 0xff 0xffff 0xffffffff 는 모두 -1 입니까? 설마요... 안타깝게도 자바스크립트에서는 signed, unsigned 구분을 임의로 할수가 없기 때문에 어떤 규칙을 만들어야 했을겁니다. 한번 살펴 보도록 하죠.
 
제가 64비트 운영체제에서 자바스크립트를 실행해 본 경험이 없어서 단언하기는 어렵습니다만, 일단 32비트 운영체제에서는 비트연산 과정에서 32비트중 첫번째 비트가 1이 되면 음수입니다. 그런데 비트연산이 아닌 더하기와 곱하기로 인한 결과인 경우에는 음수가 아닙니다. 어찌보면 당연한 것이죠. 사칙 연산은 비트들을 직접 건드린다기 보다 다른 공간에서 계산한 결과를 보여주는 것이라고 생각합니다. 비트연산이 빠른 이유도 그런것 아니겠습니까?
 
이제 c 언어에서는 볼수 없었던 >>> (Unsigned Right Shift) 연산자가 등장하게 됩니다. ㄷㄷㄷ. 이건 뭔가요. 반대로 >> 연산자는 어떻게 다른건가요? c 언어에 익숙한 개발자들에게 치명적인 실수를 유도할지도 모르는 중요한 대목입니다. 제가 이 글을 포스팅 하게 된 이유이기도 하구요.
 
>>> (Unsigned Right Shift) 부호를 무시하고 비트를 오른쪽으로 이동시킵니다. (= 비트 이동후 0으로 채웁니다.)
 
>> (Signed Right Shift) 부호를 유지하여 비트를 오른쪽으로 이동시킵니다. (= 음수는 1로 채우고 양수는 0으로 채웁니다.)
 
0xFF 는 음수가 아닌 255 지만, -1 은 0xFF 입니다. 이상하죠? 사실은 -1은 0xFFFFFFFF 입니다. -255 는 signed char 에서는 나올수 없는 값이고 signed short 에서는 0xFF01 입니다. 32비트 signed int 에서는 0xFFFFFF01 입니다. 어떤 의미이냐 하면 음수인 경우에는 형을 크게 하더라도 항상 1로 채워진다는 의미 입니다. Signed Right Shift 에서 음수는 1로 채운다는 것을 설명하는 것입니다.
 
-1은 어떨까요? -1은 어떤 경우라도 모든 비트가 1 이므로 >> n 에서 n 의 값에 관계없이 항상 -1 입니다. 32비트를 넘어서면 비트연산의 의미가 없습니다. 마지막으로 이 점도 유의 해야 겠습니다. 0x8080000000 과 0x80000000 은 다른 값이지만 비트연산을 하면 같은 값입니다.
 
(0xFF80000000>>1 == 0x80000000>>1)? true 4바이트를 넘어서는 FF 는 무시되기 때문입니다.
(0xFF80000000 == 0x80000000)? false 두 수 모두 양수이고 앞의 값이 뒤의 값보다 큽니다.
 
사실 자바스크립트에서 비트연산을 한다는것은 매우 이례적인 일이기 때문에 논하는 자체가 부담일 수 있습니다. 하지만 속도에 욕심이 있는 개발자라면 알고 사용하는것이 좋겠죠~
번호 제목 글쓴이 날짜 조회 수
237 사용자 모듈 만들기 황제낙엽 2019.07.09 41735
236 User Agent 정보 모음 file 황제낙엽 2011.02.22 7768
235 페이지 스크롤 끝 확인 황제낙엽 2011.10.24 6230
234 숫자 여부와 자리수를 체크 하는 예제 황제낙엽 2009.01.12 5265
233 User Agent Parser들 황제낙엽 2017.11.20 4132
232 ActiveX 설치 여부를 검사하는 스크립트 황제낙엽 2011.02.13 4053
231 [JavaScript Tutorials] Handling runtime errors in JavaScript using try/catch/finally (해석중) 황제낙엽 2009.04.08 2784
230 브라우저의 새로고침과 종료에 대한 이벤트 황제낙엽 2017.08.11 2725
229 연속해서 스트림 받기 (flush data from servlet to jsp with ajax) 황제낙엽 2013.01.04 2428
228 오류:호출자(서버 응용 프로그램이 아닌 서버)가 사용될 수 없어서 사라졌습니다. file 황제낙엽 2012.03.14 1949
227 외부 라이브러리 (.js) 의 바람직하지 않은 동적 로딩 (eval함수 이용) 황제낙엽 2012.01.18 1851
226 window.postMessage 이해하기 file 황제낙엽 2017.10.16 1612
225 부동소수점 (floating-point) file 황제낙엽 2018.03.26 1122
224 javascirpt IME-Mode 설정하기 황제낙엽 2010.08.17 1112
223 경과 시간 구하기 황제낙엽 2019.10.04 1071
222 CORS(Cross-Origin Resource Sharing) - 4 file 황제낙엽 2017.03.07 873
221 각 브라우저 별 User Agent 정보 황제낙엽 2011.02.22 823
220 중첩 함수, 함수 클로저 황제낙엽 2008.08.12 820
» 자바스크립트의 쉬프트 연산자 (Shift Operator) 와 음수 (Negative) 이야기 황제낙엽 2012.05.31 726
218 Memory leak 및 성능 측정 도구 file 황제낙엽 2011.11.23 666