s

자바스크립트로 논리적인 XOR 연산하기.

· 13년 전 · 3357
일단 비트 연산자와 논리 연산자. 언어 배운다면야 기본적으로 알고 배우죠.
이 중에 비트연산자는 여기서는 때려치우고, 논리연산자를 짚고 넘어가도록 하겠습니다.

자바스크립트에서 놀라운 점 몇가지 중 논리연산에 대한 재활용(?)이라면?

or 연산자가 있죠. ||.
자스에서는 이 논리 연산자 써먹을데가 보통 유용한 게 아닙니다.

var value=foo||bar;

만약에 foo를 집어넣고, foo에 값이 없으면 bar를 집어넣죠.
이거 아는분도 많고 유용하게 쓰이고 있고 하니 뭐.. 쉽고 흔한 팁입니다.
다른 언어는 가능한가요? 네! 가능합니다. 단지 PHP는 좀 손좀 봐줘야 한다고 알고있는데;
어쨌든, 제가 하고있는 C#의 경우 ?? 연산자를 사용하죠. 물론 C도 쓰겠지만.
자스는 모든 타입을 수용하다보니 이렇게 유연하다못해 흐물흐물한 연산을 처리하죠.

자. 근데 자스에는 비트로 XOR 연산자는 있습니다.
논리적인 XOR 연산? 이렇게 하면 되지 않아요?
if(foo^bar) alert(true); else alert(false);

네. 되긴 됩니다. 둘 다 부울값 혹은 0 1 둘 중 하나값이라면요.
하지만 다른 타입은? 비트연산자이기 때문에 비트로 처리해서 어자피 값이 존재하기 때문에 무조건 true가 되는 셈이 되죠.
그럼 논리적은 XOR 연산자는 있나요? 없습니다.

그렇다고 희망을 버리지 마세요. 자바스트립트는 아까 말했듯이 흐물흐물한 언어입니다.
XOR의 기본 원리만 알아도 충분히 구현이 가능한 연산이죠.
XOR의 기본 원리는 뭘까요?
쉽게 말하자면, a와 b가 서로 다르면 true, 같으면 false를 반환하는 연산자이죠?
이렇게 하면 되겠군요.
if((a||b)&&!(a&&b))
흠.. 그렇긴 한데 좀 보기도 그렇고 복잡해 보이는군요.
이걸 함수로 써먹으면 좀 괜찮아지긴 하겠죠.
function myxor(a,b){return ((a||b)&&!(a&&b));}

아하! 다른 방법이 있군요. 이번엔 좀 보기가 수월해질겁니다.
비트 연산자래도 XOR 기능을 충분히 수행할 수 있죠.
이렇게 하면 어떨까요?
if((a?1:0)^(b?1:0))
음.. 아까보단 보기도 쉬워졌군요. 그리고 XOR 연산이니까 아하 이게 그거구나 알기도 쉽구요. 가독성은 좋은데.. 이것도 복잡해서 함수로 써먹으면 제격이겠군요...

잠깐. XOR의 기본 원리는 서로 달라야 참인데 그러면 이렇게 하면 되잖아요??
if(a!=b)
네. 먹히긴 먹힙니다. 하지만 문제는 문자열과 정규식 상호비교에는 안먹힙니다. 이녀석은 문자열 비교할때나 쓰지 XOR로 쓰기엔 좀 혼란이 오기도 하죠.
하지만 ! 연산자를 쓰면 얘기가 달라집니다. 일단, XOR 연산이란 걸 컴퓨터에 알려줘야 하니 부울값으로 비교하겠끔 하는 방법. 바로 강제로 부울값으로 만들어버리면 됩니다.
값에 !을 넣어 false로 만든 다음, 두 연산자가 달라야 먹히는 진정 XOR 연산자를 만드는 방법은 바로 이겁니다.
if(!a != !b)
이렇게 하면 모든 타입에 적용이 가능하고, 정규식 비교할때도 쓸 수 있고, 여러가지로 깔끔하게 쓰일 수 있겠습니다.
|
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

태그 필터 (최대 3개) 전체 개발자 소스 기타 mysql 팁자료실 javascript php linux flash 정규표현식 jquery node.js mobile 웹서버 os 프로그램 강좌 썸네일 이미지관련 도로명주소 그누보드5 기획자 견적서 계약서 기획서 마케팅 제안서 seo 통계 서식 통계자료 퍼블리셔 html css 반응형 웹접근성 퍼블리싱 표준화 반응형웹 홈페이지기초 부트스트랩 angularjs 포럼 스크린리더 센스리더 개발자톡 개발자팁 퍼블리셔톡 퍼블리셔팁 기획자톡 기획자팁 프로그램강좌 퍼블리싱강좌
+
제목 글쓴이 날짜 조회
12년 전 조회 4,288
12년 전 조회 3,307
12년 전 조회 2,984
12년 전 조회 2,646
12년 전 조회 2,338
12년 전 조회 2,353
12년 전 조회 2,095
12년 전 조회 3,172
12년 전 조회 2,487
12년 전 조회 2,191
12년 전 조회 3,248
12년 전 조회 2,439
12년 전 조회 3,020
12년 전 조회 4,247
12년 전 조회 1,996
12년 전 조회 2,984
12년 전 조회 1,833
12년 전 조회 2,316
12년 전 조회 2,957
12년 전 조회 2,576
12년 전 조회 5,375
12년 전 조회 3,502
12년 전 조회 3,686
12년 전 조회 2,051
12년 전 조회 9,366
12년 전 조회 4,193
12년 전 조회 2,239
12년 전 조회 2,111
13년 전 조회 3,542
13년 전 조회 6,227
13년 전 조회 4,251
13년 전 조회 2,152
13년 전 조회 1.4만
13년 전 조회 2,028
13년 전 조회 1,454
13년 전 조회 4,794
13년 전 조회 2,283
13년 전 조회 1만
13년 전 조회 1,632
13년 전 조회 2,050
13년 전 조회 4,085
13년 전 조회 1,715
13년 전 조회 2,612
13년 전 조회 4,597
13년 전 조회 1,908
13년 전 조회 1,793
13년 전 조회 6,167
13년 전 조회 2,292
13년 전 조회 1,624
13년 전 조회 3,358
13년 전 조회 3,357
13년 전 조회 2,336
13년 전 조회 3,755
13년 전 조회 7,447
13년 전 조회 3,018
13년 전 조회 1,583
13년 전 조회 2,749
13년 전 조회 2,719
13년 전 조회 3,459
13년 전 조회 1,426
13년 전 조회 2,531
13년 전 조회 1,574
13년 전 조회 2,628
13년 전 조회 3,522
13년 전 조회 2,057
13년 전 조회 4,715
13년 전 조회 1.1만
13년 전 조회 1,981
13년 전 조회 3,349
13년 전 조회 2,975
13년 전 조회 3,873
13년 전 조회 6,893
13년 전 조회 3,522
13년 전 조회 3,866
13년 전 조회 1,843
13년 전 조회 1,606
13년 전 조회 2,708
13년 전 조회 6,714
13년 전 조회 2,323
13년 전 조회 5,559
13년 전 조회 1,721
13년 전 조회 4,967
13년 전 조회 2,126
13년 전 조회 1,929
13년 전 조회 2,463
13년 전 조회 2,122
13년 전 조회 1,381
13년 전 조회 1,355
13년 전 조회 2.1만
13년 전 조회 1,325
13년 전 조회 1,888
13년 전 조회 1,924
13년 전 조회 2,154
13년 전 조회 4,297
13년 전 조회 1,509
13년 전 조회 3,041
13년 전 조회 5,699
13년 전 조회 1,481
13년 전 조회 4,681
13년 전 조회 1,873