190 - Reverse bits
주어진 32비트 unsigned integer를 역순으로 만들어 리턴하는 문제입니다.
결과는 아래와 같습니다.
문제 풀이 전 이해해야 할 것
처음 이문제를 풀때 저는 n값이 이진법으로 이루어진 string이(ex) 010110101) 들어가는 줄 알았는데 콘솔로 확인해보니 정수가 들어가 있는걸 그때 알았습니다.
그러므로 우리는 32bit 정수상태인 파라미터를 이진 string으로 바꾼 후 그 이진 스트링의 거꾸로 된 값을 찾은 후 그걸 다시 32bit 정수 상태로 반환해야 하는 것입니다.
비트란
위에서 32bit와 이진수들이 나왔는데 두 개념을 이해하기위해 먼저 비트를 이해해야 합니다. 그렇다면 비트는 무엇일까요? 비트는 true(1)와 false(0)로 이루어진 이진법 배열로 정수를 나타냅니다.
예시를 살펴보겠습니다.
위와 같이 자리값이 늘어날때마다 2배씩 되며 자릿수에 1이 있다면 해당 자리값을 모두 더해주면 우리가 잘 아는 정수를 0과 1을 통해 나타낼 수 있습니다.
비트 연산자
이 문제에서 쓸 비트연산자는 shift >>연산자와 &연산자입니다.
'>>' , '<<' Shift 연산자
우선 shift는 자릿수를 이동하는 연산자입니다. shift연산자는 오른쪽 왼쪽 두 방향 모두 있습니다. 부등호가 가리키는 방향이 연산자의 방향입니다. >>오른쪽, <<왼쪽으로 자리이동
예시를 보여드리겠습니다.
5라는 값을 3번 왼쪽으로 shift한다고 가정합시다.
var a = 5, b = 3
console.log(a << b) // a << b = 40
아래 테이블을 보면 왼쪽으로 3번 이동된 101은 이동된자리에 000이 생긴것을 볼 수 있습니다. 101000은 shift를 통해 정수로 40이 됩니다.
정수 | 이진법 |
5 | 101 |
40 | 101000 |
'&' AND 연산자
And 연산자는 쉬운 이해를 위해 아래 그림을 먼저 확인해보겠습니다.
이처럼 비트 AND 연산자는 대응되는 두 비트가 모두 1일 때만 1을 반환하며, 다른 경우는 모두 0을 반환합니다.
문제풀이
var reverseBits = function(n) {
var result = 0; //리턴할 값입니다.
var count = 32; //32 길이에 이진법만 리턴할수있기때문에
while (count--) { //count를 1씩빼며 0이될때까지
result *= 2;
result += n & 1; //n & 1은 정수에서 x % 2와 같은 의미입니다. 5%2 = 1
n = n >> 1; // n >> 1 은 x / 2와 같은의미입니다. ex) 5/2 = 2
console.log(count)
console.log(result)
}
return result;
};
코멘트를 확인해보시면 n & 1이 x % 2와 같다고 하였는데 왜 그럴까요? 우선 n & 1의 의미는 n과 가장 첫 자릿수 1이 겹치면 값을 리턴하라고 합니다. 우리가 result를 모두 2를 나누다가 1이 남으면 바로 여기서 나머지 값처럼 1이 남게 됩니다. 그래서 이 값을 result에 더해주게 됩니다.
n을 오른쪽으로 한번 이동하면 나누기 2와 같은 역할을 합니다.
마무리
이번 문제는 비트 연산자와 관련된 문제였습니다. 다른 연산자를 더 배우고싶으시다면 아래 링크를 참조해주세요.