Logseq/pages/코딩팁.md
2026-01-09 18:58:13 +09:00

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
          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만 남음)