deck:: Logseq/coding tip - ## **► 비트연산 XOR(배타적 논리합)** - **기호** : {{c1 ^}} id:: 6960ba6a-cbcf-48e0-ba15-39f4e3dbc76a - **연산값 :** (0, 0) -> {{c1 0}}, (0, 1) -> {{c1 1}}, (1, 0) -> {{c1 1}}, (1, 1) -> {{c1 0}} extra:: 같으면 0, 다르면 1 id:: 6960baa5-ffe5-4782-ad1c-a75e7c3f25e8 - **핵심성질 3가지** #card id:: 6960bada-97e7-4f50-8cf7-1d1af57983b2 - 같은 값 끼리 연산하면 0이 된다. extra:: a ^ a = 0 - 0과 연산하면 자기 자신이 된다. extra:: a ^ 0 = a - 교환법칙, 결합법칙이 성립한다. extra:: a ^ b = b ^ a, (a ^ b) ^ c = a ^ (b ^ c) - **활용** - 임시변수(temp) 없이 두 변수의 값을 swap #card id:: 6960bbba-cf88-4072-ac55-c6edc540749a - ```c int a = 3; int b = 5; a = a^b; b = a^b; a = a^b; // a = 5, b = 3 ``` - 중복되는 수들의 배열에서 중복되지 않는 하나의 숫자를 찾을 때 - 사용가능한 조건 #card id:: 6960bc58-3189-4ec8-9554-cfa526027fb7 - 모든 숫자들 중 단 한개를 제외한 모든 수가 중복되는 수 일 때 - 중복되는 숫자들이 각각 짝수개로 존재하고 있으면서 찾으려는 숫자는 1개 혹은 홀수개가 존재할 경우 - 다음 코드의 출력결과는? id:: 6960bc99-5059-4e25-bd9f-502967918f5c ```c int arr[] = {1, 2, 5, 2, 2, 3, 2, 1, 5}; int res = 0; for(int i=0; i<9; i++) res ^= arr[i]; printf("%d\n", res); ``` #card - 3 (9개의 숫자들 중 1은 2개, 2는 4개, 5는 2개, 3은 1개, 따라서 3만 남음) -