티스토리 뷰
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