숫자의 총 비트 수를 계산하는 작업은 비트 연산이나 저수준 프로그래밍에서 자주 필요합니다. C#에서는 Math.Log() 메서드를 활용하면 아주 간단하게 구할 수 있습니다.
기본 개념
예를 들어 우리가 가진 숫자가 12라고 가정해 보겠습니다. 10진수 리터럴을 할당하여 uint 변수를 선언하고 초기화합니다.
uint val = 12;
12의 이진수 표현은 다음과 같습니다.
1100
위 이진수는 총 4개의 비트로 구성되어 있습니다. 따라서 숫자의 총 비트 수를 구하려면 밑(base)이 2인 로그를 계산하는 Math.Log() 메서드에 1을 더해 사용하면 됩니다.
uint res = (uint)Math.Log(val, 2.0) + 1;
동작 원리
Math.Log(val, 2.0)은 val을 2로 몇 번 나눌 수 있는지, 즉 로그의 지수 값을 반환합니다. 여기에 1을 더하면 실제 비트 개수가 됩니다. 예를 들어 12의 경우 2³ ≤ 12 < 2⁴이므로 로그 값은 약 3.58이고, 정수로 변환하면 3이 되며, 여기에 1을 더해 최종적으로 4비트라는 결과를 얻습니다.
예제 코드
다음 전체 코드를 실행하여 숫자의 총 비트 수를 직접 확인해 보세요.
using System;
public class Demo {
public static void Main() {
uint val = 12; // 이진수로 1100
uint res = (uint) Math.Log(val, 2.0) + 1;
// 1100은 4비트입니다.
Console.WriteLine("Total bits: " + res);
}
}실행 결과
Total bits: 4
주의 사항
이 방법은 입력값이 0일 때 문제가 발생할 수 있습니다. log(0)은 수학적으로 정의되지 않으므로, 0에 대한 별도의 예외 처리를 추가하는 것이 안전합니다. 또한 부동소수점 연산의 특성상 매우 큰 수에서는 정확도 오차가 생길 수 있으므로, 완벽한 정확성이 요구되는 경우에는 비트 시프트 연산(>>)을 반복하며 비트를 세는 방식을 대안으로 고려할 수 있습니다.