반응형
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
*/
반응형