1.6 KiB
1.6 KiB
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
-
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
#cardint 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);- 3 (9개의 숫자들 중 1은 2개, 2는 4개, 5는 2개, 3은 1개, 따라서 3만 남음)
- 사용가능한 조건 #card
id:: 6960bc58-3189-4ec8-9554-cfa526027fb7
- 임시변수(temp) 없이 두 변수의 값을 swap #card
id:: 6960bbba-cf88-4072-ac55-c6edc540749a