이진수 회문이란?
회문(Palindrome)은 앞에서 읽으나 뒤에서 읽으나 같은 값을 의미합니다. 숫자의 이진 표현에도 동일한 개념을 적용할 수 있습니다.
예를 들어, 숫자 5의 이진 표현은 다음과 같습니다.
101
101을 뒤집어도 여전히 101이므로, 숫자 5는 이진 표현 기준으로 회문입니다. 그렇다면 C#에서는 어떻게 이를 확인할 수 있을까요? 핵심은 비트 연산자를 활용해 비트를 뒤집은 뒤 원래 값과 비교하는 것입니다.
비트 반전 함수 구현
아래 함수는 비트 단위 왼쪽 시프트(<<)와 오른쪽 시프트(>>) 연산자를 사용하여 주어진 숫자의 비트를 역순으로 뒤집습니다.
public static long funcReverse(long num) {
long myRev = 0;
while (num > 0) {
myRev <<= 1; // 결과값을 왼쪽으로 한 비트 시프트
if ((num & 1) == 1) // 현재 최하위 비트가 1인지 확인
myRev ^= 1; // 1이라면 결과값의 최하위 비트를 1로 설정
num >>= 1; // 입력값을 오른쪽으로 한 비트 시프트
}
return myRev;
}동작 원리
이 알고리즘은 다음 과정으로 작동합니다.
1. 입력 숫자의 최하위 비트(LSB)를 num & 1로 확인합니다.
2. 해당 비트가 1이면 결과 변수 myRev의 최하위 비트를 1로 설정하고, 0이면 그대로 둡니다.
3. myRev는 매 반복마다 왼쪽으로 시프트되어 새로운 비트가 뒤에서부터 쌓입니다.
4. 입력 숫자를 오른쪽으로 시프트하며 모든 비트를 처리할 때까지 반복합니다.
회문 여부 검사 함수
원래 숫자와 위 함수로 얻은 뒤집힌 값이 일치하는지 비교하면 회문 여부를 판별할 수 있습니다.
public static bool checkPalindrome(long num) {
long myRev = funcReverse(num);
return (num == myRev);
}전체 예제 코드
다음은 숫자의 이진 표현이 회문인지 확인하는 완전한 C# 프로그램입니다.
using System;
public class Demo {
public static long funcReverse(long num) {
long myRev = 0;
while (num > 0) {
myRev <<= 1;
if ((num & 1) == 1)
myRev ^= 1;
num >>= 1;
}
return myRev;
}
public static bool checkPalindrome(long num) {
long myRev = funcReverse(num);
return (num == myRev);
}
public static void Main() {
// 5의 이진 값은 101
long num = 5;
if (checkPalindrome(num))
Console.WriteLine("Palindrome Number");
else
Console.WriteLine("Not a Palindrome Number");
}
}실행 결과
Palindrome Number
추가 예시
참고로 숫자 6의 이진 표현은 110이며, 이를 뒤집으면 011(즉, 3)이 되어 원래 값과 다르므로 회문이 아닙니다. 반면 9(이진수 1001)나 15(이진수 1111)처럼 대칭 구조를 가진 숫자들은 회문으로 판별됩니다.
마무리
이 방식은 산술 연산 없이 순수하게 비트 시프트와 XOR 연산만으로 구현되기 때문에 효율적이며, 임베디드 환경이나 성능이 중요한 상황에서도 유용하게 활용할 수 있습니다.