티스토리 뷰

728x90
SMALL

and &

둘다 1일때만 참

9 : 01001(앞에 0은 생략함 뒤에도 마찬가지)

5 : 00101

9&5 : 1

 

or |

둘 중 하나만 1이어도 참

9 : 01001

5 : 00101

9|5 : 01101 => 1+4+8=13

 

xor ^

하나만 1일때 참

9 : 01001

5 : 00101

9^5 : 01100 => 12

 

not ~

모든 비트를 뒤집는다.

9 : (000000000000000000000~~)01001

~9 : (11111111111111111~~)10110 =>-10

 

왼쪽 이동 <<

모든 비트가 왼쪽으로 이동, 왼쪽 끝 범위를 벗어나는 비트는 버린다.

보통 2배야. 범위 벗어날 때는 줄어들 수도 있어(2를 기반으로 하기 때문)

9 : 00001001

9<<1 : 00100100 =>18

9<<2 : 10010000 => 36

 

오른쪽 이동 >>

모든 비트가 오른쪽으로 이동, 오른쪽 끝 범위를 벗어나는 비트는 버린다.

9 : 001001

9>>1 : 00100 =>4

위의 예에서 오른쪽 이동은 9를 2로 나눈다.(정수 나눗셈)

 

오른쪽 이동 후 0으로 채우기 >>>

부호 비트가 이동한 후에 0ㅇ로 변한다. 이로 인해 결과는 음이 아닌 숫자가 된다. 오른쪽 이동 후 0으로 채우기 연산자를 나타내기 위해 >>>를 사용한다.

-9 : 111111111111111110111

-9>>>1 : 01111111111111111111011 =>2147483643

 

덧셈

십진수로 생각하면 b가 올리는 자리수라고 생각

function BitwiseAdd(a, b) {
  while (b != 0) {
    var carry = a & b;
    a = a ^ b;
    b = carry << 1;
  }
  return a;
}

console.log(BitwiseAdd(4, 5)); // 9

 

 

뺄셈

뺄셈을 마이너스 덧셈으로 생각

function BitwiseNegate(a) {
  return BitwiseAdd(~a, 1);
}

console.log(BitwiseNegate(9)); // -9
// negation with itself gives back original
console.log(BitwiseNegate(BitwiseNegate(9))); // 9

function BitwiseSubtract(a, b) {
  return BitwiseAdd(a, BitwiseNegate(b));
}

console.log(BitwiseSubtract(5, 4)); // 1

 

곱셈

이진수를 곱하는 방식은 십진수를 곱하는 방식과 동일하다. 두 수를 곱한 다음, 10이 넘는 수는 다음 자릿수로 올리고, 다음 자릿수로 이동해 해당 자릿수의 수를 곱한다.

책 설명 존나 부족하네

a가 0일때는 넘어가고 a가 1일때는 b를 더한다고 생각해

즉 a*b=b+b+~~~ a번

function BitwiseMultiply(a, b) {
  var m = 1,
    c = 0;

  if (a < 0) {
    a = BitwiseNegate(a);
    b = BitwiseNegate(b);
  }
  while (a >= m && b) {
    if (a & m) {
      c = BitwiseAdd(b, c);
    }
    b = b << 1;
    m = m << 1;
  }
  return c;
}
console.log(BitwiseMultiply(4, 5)); // 20

 

나눗셈

나눗셈을 a/b일 때 a로부터 b를 여러 번 빼는 것이라고 생각    4/2=2   4-2-2=0

 

양수 나눗셈

function BitwiseDividePositive(a, b) {
  var c = 0;

  if (b != 0) {
    while (a >= b) {
      a = BitwiseSubtract(a, b);
      c++;
    }
  }
  return c;
}
console.log(BitwiseDividePositive(10, 2)); // 5

 

나눗셈

function BitwiseDivide(a, b) {
  var c = 0,
    isNegative = 0;

  if (a < 0) {
    a = BitwiseNegate(a); // convert to positive
    isNegative = !isNegative;
  }
  

  if (b < 0) {
    b = BitwiseNegate(b); // convert to positive
    isNegative = !isNegative;
  }

  if (b != 0) {
    while (a >= b) {
      a = BitwiseSubtract(a, b);
      c++;
    }
  }

  if (isNegative) {
    c = BitwiseNegate(c);
  }

  return c;
}

console.log(BitwiseDivide(10, 2)); // 5
console.log(BitwiseDivide(-10, 2)); // -5
console.log(BitwiseDivide(-200, 4)); // -50
728x90
LIST

' > 자바스크립트로 하는 자료 구조와 알고리즘' 카테고리의 다른 글

동적 프로그래밍  (0) 2020.12.22
그래프  (0) 2020.12.22
  (0) 2020.12.21
트리  (0) 2020.12.21
캐싱  (0) 2020.12.21
댓글
공지사항