2017-10-11 3 views
0

좋아, 나는이 작은 문제를 완전히 연구하고 연구하려고 시간을 보냈다. 기본적으로 정수에 대해 최대 비트 수 (제한으로 바이트 사용)를 찾아야합니다. 내가 뭘하려고하는지 예를 들면 : int 5는 8로 표시 될 것입니다. 왜냐하면 바이트에서 0000 0101로 저장되기 때문입니다. 255까지의 모든 내용은 8을 출력해야합니다. 256으로되면 출력해야합니다 16으로 저장되므로 0001 0000 0000이됩니다. if 문을 사용할 수 있지만 로그를 사용하여 더 쉬운 방법이 있습니까?특정 정수에 대한 최대 비트 수 찾기

지금까지이 모든입니다

int x = 5; 
    int len = (Integer.toString(x)).length(); 
    double bits = Math.ceil(len*(Math.log(10)/Math.log(2))); 
    System.out.println(bits); 
+0

. 첫 번째 원칙은 당신의 사고를 명확히하는 것입니다. – EJP

답변

1

매우 간단한 방법 :

    이베이스 (256)이 번호의 자릿수를 계산하여 (부분 바이트를 포함하여) 다수의 바이트 수를 계산

    final double DIVISOR = Math.log(256); 
    
    int x = 5; 
    double bytes = Math.log(x)/DIVISOR; 
    int bits = (int) Math.ceil(bytes) * 8; 
    

    두 기법을 사용

  • 숫자 x의 자릿수는 n입니다. 로그는 n (x)입니다.
  • 로그 N (X) (X)/어떤 미터위한 m (N)를 기록 m 로그 동등하다.

그런 다음 결과를 반올림하여 (부분 바이트 처리) 8을 곱하여 비트 수를 얻습니다.

그러나 이것은 매우 효율적인 접근 방법은 아닙니다. 비트 조작을 사용하는 더 효율적인 방법이 있지만 이해하기는 좀 더 어려울 수 있습니다. 이 방법은 적어도 이미 시도한 것과 비슷합니다.

0

이 시도 :

int bytesNeeded(int x) { 
    int bytes = 0; 
    for (; x != 0; bytes++) { 
     x >>>= 8; // Shift 8 bits (1 byte) right 
     bytes++; // Count 1 more byte 
    } 
    return bytes; 
} 

x >>> y

y 바이트만큼 오른쪽으로 x를 이동하고, 왼쪽에 0을 삽입합니다. 예 : 0b00000001 >>> 1 => 0b000000000b11110000 >>> 2 => 0b00111100. 이 함수는 왼쪽에 1이 없을 때까지 x를 한 번에 1 바이트 씩 아래로 이동합니다. 이동해야하는 시간은 표현하는 데 필요한 바이트 수입니다.

EDIT : 음수를 처리하기 위해 >>> 연산자로 전환되었습니다.

0

또한 재귀를 사용할 수 있습니다 : 당신이 정말 당신의 설명에 따라 원하는 것은 바이트의 8 배, 비트 수가 아닌 수입니다

int getNumberOfBytes(int number) { 
    if((int)(number/256) == 0) { 
     return 1; 
    } 

    return getNumberOfBytes(number/256) + 1; 
} 
관련 문제