2017-12-20 11 views
0

중복 된 질문 일 가능성이 있지만 검색 할 때 비슷한 질문을 찾을 수 없습니다.런타임시 특정 정수에 몇 바이트가 필요합니까?

런타임에 int에 필요한 부호있는 바이트 수를 결정하는 쉽고 효율적인 방법을 찾고 있습니다.

예를 들어, 다음과 같은 값을 가진 int을 고려

1  - Requires 1 Byte 
10 - Requires 1 Byte 
128 - Requires 2 Bytes 
1024 - Requires 2 Bytes 
32768 - Requires 3 Bytes 
... 
Integer.MAX_VALUE - Requires 4 Bytes 

편집 : 그것은 나에게 분명 int이 값에 관계없이 메모리의 4 개 byte의 필요하다는 것을. 그럼에도 불구하고, 나는 그렇지 않은 경우에 값이 차지할 바이트의 양을 찾고있다.

이상적으로 내가 찾고 대답은 비트 조작을 사용하고 누군가가이 일을 훨씬 더 효율적인 방법하지만 간단한을 가지고 확신 0

+1

바이트는 8 비트입니다. 번호에 필요한 비트 수를 식별해야합니다. –

+0

@ ThorbjørnRavnAndersen 내 번호가 필요한 '바이트'수를 확인하려고합니다. –

+2

Java에서 'int'는 내용에 관계없이 항상 4 바이트의 메모리가 필요합니다. – Alnitak

답변

3

한 줄 솔루션 : 32 - Integer.numberOfLeadingZeros(n)가 가장 높은 1 비트의 위치를 ​​반환

public int bytesCount(int n) { 
    return n < 0 ? 4 : (32 - Integer.numberOfLeadingZeros(n))/8 + 1; 
} 

. 그 후에 필요한 바이트 수를 쉽게 계산할 수 있습니다.

+0

서명 된'byte' 값으로 작동하므로 찾고있는 것이 었습니다. 고맙습니다! –

+0

'numberOfLeadingZeros()'의 구현을 점검하여 이미 가지고있는 것보다 낫다는 것을 확인할 수 있습니다. http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/lang/Integer.java#Integer.numberOfLeadingZeros%28int%29 –

0

의 입력 1의 값을 반환 이해하기 쉬우므로 2의 상한 출력이 무엇보다 높은지를 알기 쉽습니다. 따라서 이제는 얼마나 많은 비트가 들어갈 지 알 수 있습니다. 그러면 8로 나누어서 필요한 바이트 수를 계산할 수 있습니다.

int bytesInInt(int i) { 
    int exp = 0; 
    while (Math.pow(2,exp) < i) { 
     exp++; 
    } 
    return ((exp + 1)/8) + 1; 
} 
0

당신은 1 바이트 (byte)에 저장 될 수있는 숫자의 경계, 2 바이트 (short), 3 바이트에 대해 그것을 확인할 수 있습니다. 요구 사항에 따라

int bytes_needed(int n){ 
    if(n >= -128 && n <= 127){ 
     return 1; 
    } else if(n >= -32768 && n <= 32767){ 
     return 2; 
    } else if(n >= -8388608 && n <= 8388607){ 
     return 3; 
    } else { 
     return 4; 
    } 
} 
관련 문제