2017-12-20 26 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

一行ソリューション:

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

32 - Integer.numberOfLeadingZeros(n)は、最高の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; 
    } 
} 
関連する問題