javascript algorithms / algorithms / countSetBits

YOUNGJOO-YOON·2021년 12월 23일
0

알고리즘

목록 보기
8/12

countSetBits가 대체 뭐냐?

3 = (0011)이다. set 되어 있는 비트는 1 이 두 개 이므로 2이다.
4 = (0100)이다. set 되어 있는 비트는 1 이 한 개 이므로 1이다.

이런 느낌의 알고리즘이라는 것이다.

어떻게 구할 수 있을까?

const readline = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout,
});

export default readline;
import readline from './readLine';

export default function countSetBits(originalNumber: number) {
  let setBitsCount = 0;
  let number = originalNumber;

  while (number) {
    /**
     *
     * @param {number} number
     * @return {number}
     *
     * @abstract number를 입력받아 해당 number의 비트 가장 마지막 자리가 1인 경우
     * setBitsCount+=1을 한다. 이를 number & 1로 표현했는데 어차피 비교하는 두 대상의 각 2진 자리수가 1인 경우 1을 반환하기 때문에
     * cnt += number & (0001);로 표현하였다.
     *
     * 그 다음 >>>= 1; 을 통해 number의 비트 자리수를 우측으로 shift 한다.
     * number가 3(0011)인 경우 setBitsCount는 (0011) & (0001)에 의해 setBitsCount+1로 초기화 되고
     * 3은 한 자리수가 버려져 (0001)이 된다. >>>= 연산을 통해 while문의 조건이 깨지게 되어 루프를 탈출하게 된다.
     *
     * 이어서 0001이 된 number는 (0001) & (0001) = 1을 반환받아 setBitsCount+1로 초기화 되고
     * 따라서 setBitsCount = 2가 된다.
     *
     * number = (0011); 1 = (0001);
     * setBitsCount += 0011 & 1
     *  & 연산
     *  0011 (3)
     *  0001 (1)
     *  ----
     *  0001 (1)
     */
    setBitsCount += number & 1;
    /**
     *  a >>> b  a의 이진 표현을 b만큼 오른쪽으로 이동하고, 1 미만으로 이동한 비트는 버립니다. 왼쪽은 0으로 채웁니다.
     *
     * 0011 >>> 1 = 0001
     */
    number >>>= 1;
  }
  return setBitsCount;
}

readline.question(`input : `, (input: string) => {
  //   console.log(`hello ,`, input);

  const number = Number(input);
  if (typeof number === 'number') {
    console.log(countSetBits(number));
  }

  console.log('type error');
  readline.close();
});
profile
이 블로그의 글은 제 생각을 정리한 글과 인터넷 어딘가에서 배운 것을 정리한 글입니다. 출처는 되도록 남기도록 하겠습니다. 수정 및 건의 오류 등이 있으면 언제든지 댓글 부탁드립니다.

0개의 댓글