상세 컨텐츠

본문 제목

🔍 ~ (비트 NOT) vs ^ (비트 XOR) 연산 차이점

자료구조&알고리즘/C++

by geminanolja 2025. 3. 5. 21:41

본문

🔍 ~ (비트 NOT) vs ^ (비트 XOR) 연산 차이점

~(비트 NOT)과 ^(비트 XOR)는 비트 마스킹에서 매우 중요한 연산자


✅ 1️⃣ ~ (비트 NOT 연산자)

S = ~S;

📌 동작 방식

  • 비트 반전(Complement, 보수 연산) 을 수행
  • 즉, 1을 0으로, 0을 1로 뒤집음.
  • 단항 연산자로 한 개의 숫자에 대해서만 동작

📌 예제

int S = 0b00001111;  // 15 (0x0F)
S = ~S;

✔️ 결과

S = 0b11110000  // -16 (2의 보수 표현)

🚨 C++에서는 ~S를 수행하면 음수 값(2의 보수 형태)이 나올 수 있으므로 주의!
예를 들어 ~0b00001111 = 0b11110000이 되는데, 이는 signed int로 해석하면 -16


✅ 2️⃣ ^ (비트 XOR 연산자)

S = S ^ (1 << idx);

📌 동작 방식

  • 두 개의 값을 비교하여 같으면 0, 다르면 1을 반환
  • 특정 비트를 토글(toggle, 0↔1) 하는 데 사용

📌 예제

int S = 0b00001111;  // 15 (0x0F)
S = S ^ 0b00000101;  // XOR 연산 수행

✔️ 결과

S = 0b00001010  // 10 (0x0A)

🚀 즉, XOR 연산을 사용하면 특정 비트를 반전(Toggle)할 수 있음!


✅ 3️⃣ ~와 ^의 차이점 정리

연산자 연산 방식 특징

~S 비트를 모두 반전 (1 ↔ 0, 0 ↔ 1) 단항 연산자(숫자 1개만 사용)
S ^ X X와 비교하여 같은 비트는 0, 다른 비트는 1 이항 연산자(숫자 2개 필요), 특정 비트 토글 가능

✅ 4️⃣ ~와 ^의 비트마스크 활용 예제

🚀 예제 1: ~을 이용한 비트 반전

int S = 0b11001010;  // 202 (0xCA)
S = ~S;

✔️ 결과

S = 0b00110101  // -203 (signed int일 경우)

모든 비트를 반전하지만, C++에서는 2의 보수 표현으로 인해 음수 값이 나올 수 있음! 🚨


🚀 예제 2: ^을 이용한 특정 비트 토글

int S = 0b00001111;  // 15 (0x0F)
S ^= (1 << 2);  // 3번째(2번째 인덱스) 비트를 토글

✔️ 결과

S = 0b00001011  // 11 (0x0B)

🚀 이제 2번째 비트(0b0100)가 반전됨!
즉, ^ 연산자는 특정 비트를 조작하는 데 사용됨.


✅ 5️⃣ 결론 (언제 사용해야 할까?)

사용 목적 적절한 연산

전체 비트 반전 (1 ↔ 0, 0 ↔ 1) ~S 사용
특정 비트 반전 (Toggle) S ^= (1 << idx) 사용
특정 비트를 1로 설정 (켜기) `S
특정 비트를 0으로 설정 (끄기) S &= ~(1 << idx) 사용

🚀 즉, ~는 전체 비트를 반전하는 데 사용하고, ^는 특정 비트만 토글하는 데 사용하면 돼! 😊

🔍 ~ (비트 NOT) vs ^ (비트 XOR) 연산 차이점

~(비트 NOT)과 ^(비트 XOR)는 비트 마스킹에서 매우 중요한 연산자지만, 동작 방식이 완전히 다름


✅ 1️⃣ ~ (비트 NOT 연산자)

S = ~S;

📌 동작 방식

  • 비트 반전(Complement, 보수 연산) 을 수행
  • 즉, 1을 0으로, 0을 1로 뒤집음.
  • 단항 연산자로 한 개의 숫자에 대해서만 동작

📌 예제

int S = 0b00001111;  // 15 (0x0F)
S = ~S;

✔️ 결과

S = 0b11110000  // -16 (2의 보수 표현)

🚨 C++에서는 ~S를 수행하면 음수 값(2의 보수 형태)이 나올 수 있으므로 주의!
예를 들어 ~0b00001111 = 0b11110000이 되는데, 이는 signed int로 해석하면 -16


✅ 2️⃣ ^ (비트 XOR 연산자)

S = S ^ (1 << idx);

📌 동작 방식

  • 두 개의 값을 비교하여 같으면 0, 다르면 1을 반환
  • 특정 비트를 토글(toggle, 0↔1) 하는 데 사용

📌 예제

int S = 0b00001111;  // 15 (0x0F)
S = S ^ 0b00000101;  // XOR 연산 수행

✔️ 결과

S = 0b00001010  // 10 (0x0A)

🚀 즉, XOR 연산을 사용하면 특정 비트를 반전(Toggle)할 수 있음!


✅ 3️⃣ ~와 ^의 차이점 정리

연산자 연산 방식 특징

~S 비트를 모두 반전 (1 ↔ 0, 0 ↔ 1) 단항 연산자(숫자 1개만 사용)
S ^ X X와 비교하여 같은 비트는 0, 다른 비트는 1 이항 연산자(숫자 2개 필요), 특정 비트 토글 가능

✅ 4️⃣ ~와 ^의 비트마스크 활용 예제

🚀 예제 1: ~을 이용한 비트 반전

int S = 0b11001010;  // 202 (0xCA)
S = ~S;

✔️ 결과

S = 0b00110101  // -203 (signed int일 경우)

모든 비트를 반전하지만, C++에서는 2의 보수 표현으로 인해 음수 값이 나올 수 있음! 🚨


🚀 예제 2: ^을 이용한 특정 비트 토글

int S = 0b00001111;  // 15 (0x0F)
S ^= (1 << 2);  // 3번째(2번째 인덱스) 비트를 토글

✔️ 결과

S = 0b00001011  // 11 (0x0B)

🚀 이제 2번째 비트(0b0100)가 반전됨!
즉, ^ 연산자는 특정 비트를 조작하는 데 사용됨.


✅ 5️⃣ 결론 (언제 사용해야 할까?)

사용 목적 적절한 연산

전체 비트 반전 (1 ↔ 0, 0 ↔ 1) ~S 사용
특정 비트 반전 (Toggle) S ^= (1 << idx) 사용
특정 비트를 1로 설정 (켜기) `S
특정 비트를 0으로 설정 (끄기) S &= ~(1 << idx) 사용

🚀 즉, ~는 전체 비트를 반전하는 데 사용하고, ^는 특정 비트만 토글하는 데 사용

관련글 더보기