2011-12-04 8 views
-2

与えられた整数を表現するのに必要なバイト数を私に与えるにはJavaの関数が必要です。今の私はこれにこだわっている:与えられた整数を表現するために必要なバイト数を決定するにはどうすればよいですか?

numOfBytes = Integer.highestOneBit(integer)/8 

が正確に何を知ってはいけない - > 2、822222 - など> 3、

@Edit私は2を渡すと、それは1、400を返す必要がありますhighestOneBit()はありませんが、また、これを試してみました:私はいくつかのウェブサイト上で見つける

numOfBytes = (int) (Math.floor(Math.log(integer)) + 1); 

を。

+2

に等しいです。だからあなたが求めていることは意味をなさない。 –

+1

@AmirRaminfar彼はおそらく、数字を表すのに必要な最小バイト数を要求しています(先行ゼロを削除します)。 – Jeffrey

+0

@Jeffreyはい、そうです。 – wassup

答えて

1
static int byteSize(long x) { 
    if (x < 0) throw new IllegalArgumentException(); 
    int s = 1; 
    while (s < 8 && x >= (1L << (s * 8))) s++; 
    return s; 
} 
0

通常の10進数を使用して同じ問題を解決する方法について考えてみましょう。次に、バイナリ/バイト表現に同じ原理を適用します。つまり、10進数に10を使用する256を使用します。

0
static int byteSize(long number, int bitsPerByte) { 
    int maxNumberSaveByBitsPerByte = // get max number can be saved by bits in value bitsPerByte 
    int returnValue = getFloor(number/maxNumberSaveByBitsPerByte); // use Math lib 
    if(number % maxNumberSaveByBitsPerByte != 0) 
      returnValue++; 
    return returnValue; 
} 
2

これを行うレイジー/非効率的な方法は、Integer#toBinaryStringです。それはあなたのために正の数からすべての先行ゼロを削除します。あなたがしなければならないのは、String#lengthを呼び出して、8で割ります。

3

Integer.highestOneBit(arg)は、元の場所で最も高い設定ビットのみを返します。例えば、Integer.highestOneBit(12)はない3.あなたはおそらくInteger.numberOfTrailingZeros(Integer.highestOneBit(12))を使用する場合は、ここでは3を返すんどれがInteger API

いくつかのサンプルコードで、8:

numOfBytes = (Integer.numberOfTrailingZeroes(Integer.highestOneBit(integer)) + 8)/8; 

+ 8は、適切な丸めのためです。

0

正の値の場合:0と1は1桁、2桁の場合は最大の2倍、各桁の場合は2桁です。だから、再帰的な解決策を分割することである。

public static int binaryLength (long l) { 
    if (l < 2) return 1; 
    else 1 + binaryLength (l /2L); 
} 

あまりにも作品をシフト:

public static int binaryLength (long l) { 
    if (l < 2) return 1; 
    else 1 + binaryLength (l >> 1); 
} 

負の値はリード1を持っているので、質問に対してあまり意味がありません。 binary1がdecimal1であると仮定すると、binary1は-1になることはできません。しかし、それは何でしょうか? b11?それは任意の浮動小数点演算を必要としないため、この実装は、パフォーマンスに優しいながら、十分にコンパクトである

private static int byteSize(int val) { 
    int size = 0; 
    while (val > 0) { 
     val = val >> 8; 
     size++; 
    } 
    return size; 
} 
0

です任意のループ。これは、フォームから派生し

int numOfBytes = Math.ceil((Integer.SIZE - Integer.numberOfLeadingZeros(n))/Byte.SIZE); 

最適化された形でのマジックナンバー3が前提から来ている:Byte.SIZEはすべてint型が32ビットのメモリ空間で表現されている8

0
int numOfBytes = (Integer.SIZE >> 3) - (Integer.numberOfLeadingZeros(n) >> 3); 

も:それはあなたがこのような単純な何かをしないだろう、なぜ3

関連する問題