[33-js-concepts] 12. 비트 연산자, 형식화 배열, 버퍼 (Bitwise Operators, Type Arrays and Array Buffers)

https://jsperf.com/or-vs-floor/2

 

자바스크립트에서 모든 숫자는 부동 소수점형 숫자형으로 취급된다.

자바스크립트에서 비트연산을 할때는 정수형으로 변환한 후 연산을 실행한다.

이러한 특성 때문에 다른 네이티브 언어에서의 비트연산자에 비해 속도가 매우 느리다.

속도 상의 이유로 비트연산자를 고집할 필요는 없다.

 

비트 연산자의 종류

AND 연산::&

OR 연산::|

XOR 연산::^

NOT 연산::~

왼쪽 쉬프트 연산:: <<

부호유지 오른쪽 쉬프트 연산::>>

부호 버림 오른쪽 쉬프트 연산::>>>

 

const AA =25;
const BB =3;
console.log(AA,"(",AA.toString(2),")",'&',BB,"(",BB.toString(2),")","=",(AA &BB),"(",(AA &BB).toString(2),")");
console.log(AA,"(",AA.toString(2),")",'|',BB,"(",BB.toString(2),")","=",(AA |BB),"(",(AA |BB).toString(2),")");
console.log(AA,"(",AA.toString(2),")",'^',BB,"(",BB.toString(2),")","=",(AA^BB),"(",(AA^BB).toString(2),")");
console.log(AA,"(",AA.toString(2),")",'>>',BB,"=",(AA > >BB),"(",(AA > >BB).toString(2),")");
console.log(AA,"(",AA.toString(2),")",'>>>',BB,"=",(AA > > >BB),"(",(AA > > >BB).toString(2),")");
console.log(AA,"(",AA.toString(2),")",'<<',BB,"=",(AA < <BB),"(",(AA < <BB).toString(2),")");
console.log("~",AA,"(",AA.toString(2),")","=",~AA,"(",(~AA).toString(2),")")
 
/*
 
25 ( 11001 ) & 3 ( 11 ) = 1 ( 1 )
25 ( 11001 ) | 3 ( 11 ) = 27 ( 11011 )
25 ( 11001 ) ^ 3 ( 11 ) = 26 ( 11010 )
25 ( 11001 ) >> 3 = 3 ( 11 )
25 ( 11001 ) >>> 3 = 3 ( 11 )
25 ( 11001 ) << 3 = 200 ( 11001000 )
~ 25 ( 11001 ) = -26 ( -11010 )
 
*/

 

And 마스크 연산과  OR 선택적 스위칭

const R =44< <16;
const G =128< <8;
const B =77;
const color =R |G |B;
console.log("color:",color.toString(16));
 
const R_val =(color &0xff0000) > >16;
const G_val =(color &0x00ff00) > >8;
const B_val =(color &0x0000ff);
console.log("R=",R_val,"=>",R_val.toString(16));
console.log("G=",G_val,"=>",G_val.toString(16));
console.log("B=",B_val,"=>",B_val.toString(16));
 
/*
 
color: 2c804d
R= 44 => 2c
G= 128 => 80
B= 77 => 4d
 
*/

 

XOR을 이용한 스위칭

let flag =true;
flag^ =1;
console.log(Boolean(flag));
flag^ =1;
console.log(Boolean(flag));
 
/*
false
true
*/

 

비트연산과 일반연산의 속도비교

console.time("*");
let sum =1;
for(let i =0;i <1000000000;i + +)//10억번
{
    sum * =2;
    sum / =2;
}
console.log('(*)',sum);
console.timeEnd("*");
 
console.time("<<");
sum =1;
for(let i =0;i <1000000000;i + +)
{
    sum < < =1;
    sum > > =1;
}
console.log('(<<)',sum);
console.timeEnd("<<");
 
/*
 
(*) 1
*: 1093.001ms
(<<) 1
<<: 608.964ms
 
*/

댓글(0)

Designed by JB FACTORY