예제 6-13 코드중에서
function digit8(v) { // 숫자 v를 8비트 2진수로 변환
var str="";
for(i=0; i<8; i++, v<<=1) {
if((v & 0x80)) str += "1";
else str += "0";
}
return str;
}
질문1. var str="" 이란 코드를 안쓰면 웹페이지상에 출력이 안되더라구요.
근데 변수 같은 경우에 따로 var x;를 선언하지 않아도
x=10; 이라고 써놓으면 알아서 x 변수가 만들어진다고 책에서 보았는데
문자열 같은경우는 var str=""; 이라고 선언해놓지 않으면
str+="hi" 라고 써놓는다고 해서 str이 자동으로 만들어지는 게 아닌가요?!
질문2.
어떤 식으로 10진수를 2진수 숫자로 바꾸어 출력하는지는 감이 잡히는데요.
0x80이 10000000 니까 1이 겹치면 str에 1을 추가하고 x를 왼쪽으로 시프트하는 작업을 8번 반복하는 것 같습니다.
여기서 v<<=1 에서 <<=은 <<와 같은 건가요? <<=이걸로 왼쪽으로 시프트 하는 것 같은데 '='는 왜 들어가있는 건지 궁금합니다
책에선 <<, >>, >>> 만 나와있어서요.
답변 주시면 감사하게씁니다
1. 문제는 변수의 초기화 입니다.
var str;을 선언하지 않고 str 만 사용해도 변수가 잡히는 것은 맞습니다.
그런데,
str += "1" ---> str = str + "1"이니까 str 변수가 생기기는 하지만, 처음 str의 값이 초기화되지 않으면 문제가 생기겠지요.
str이 생기고 자동으로 "" 값이 들어가는 것은 어닙니다.
개발자가 변수를 초기화하지 않으면 undefined로 초기화됩니다.
var str="";은 변수 선언과 함께 str 값을 ""로 초기화하는 것입니다.
2. <<=은 책의 표 6-4에 있습니다.
v <<= 1; ---> v = v << 1;을 줄여 쓴 것입니다.
즉 변수 v의 이진수를 1비트 왼쪽으로 시프트시키는 코드입니다.
3.
v & 0x80, 즉 v에 10000000을 AND 연산시키는 이유는 현재 비트 값 1이 있는 위치에 v의 비트가 1인지 0인지 검사하려는 것입니다.
AND 연산은 둘다 1인 경우에만 1이되지요. 그래서 1000000에서 최상위 비트가 1이므로 v의 최상위 비트가 1인 경우가 아니라면 v에 어떤 값이 들어 있어도
그 결과는 0이 됩니다.
v & 0x80의 연산 결과는 0이 됩니다.
그래서 if(v & 0x80) 이 참이라는 것은 v & 0x80의 결과가 0이 아니라는 뜻입니다. 즉 v의 최상위 비트에 1이 있었다는 뜻이죠.
v가 만일 3이라면, 즉 00000011이라면
00000011 &
10000000
---> 두 값을 AND 연산하여 결과는 다음과 같이 0
00000000
다시 v <<= 1 연산하면, v = 00000110이고, 이것과 0x80을 AND 하면
00000110 &
10000000
---> 두 값을 AND 연산하여 결과는 다음과 같이 0
00000000
다시 v <<= 1 연산하면, v = 00001100이고, 이것과 0x80을 AND 하면
00001100 &
10000000
---> 두 값을 AND 연산하여 결과는 다음과 같이 0
00000000
....
11000000 &
10000000
---> 두 값을 AND 연산하여 결과는 다음과 같이 0이 아님
10000000
다시 v <<= 1 연산하면, v = 10000000이고, 이것과 0x80을 AND 하면
10000000 &
10000000
---> 두 값을 AND 연산하여 결과는 다음과 같이 0이 아님
10000000
이렇게 작동합니다.