2009-06-30 9 views
1

機能の書き込み:私は、関数の短いgetBits(短いデータ、int型のp、int型n)を書いています短いGetBits(短いデータ、int型のp、int型のn)

私が試してみました:

public static short getBits(short data, int p, int n) { 
    short bitmask = (short) ((~0 << (16 -n)) >>> p); 
    short returnVal = (short) ((bitmask & data) >>> (16 - n)); 
    return returnVal; 
} 

これはgetBits((short)0x7000、0、4)で動作しますが、7を8に置き換えると負の値になります。

答えて

2

この事を動作させるために、Javaのデータ型について覚えておくべきいくつかのものがあります。

私はあなたのためにあなたの式の明示的なキャストの有無のint型の変数を使用していると仮定しています。変数にint型を使用している場合:data start_pos、length; intの値は32ビットなので、16の代わりに32を使うべきです。

int、shortまたはbyteのような整数プリミティブ型を使用する場合は、これらのプリミティブ型は符号拡張された2の補数であることに注意してください。つまり、〜0などの負の数に右シフトを実行すると(-1と評価される)、それらはゼロの代わりに上位ビット(符号ビット)上に付加される。例えば

1111 1111 1111 1111 1111 1111 1111 1000   
>>1 
1111 1111 1111 1111 1111 1111 1111 1100 

は、今すぐあなたの問題に戻ります。

data & mask 

ここで、マスクの生成は、符号付きデータ型では少し難解です。

しかし、これは符号拡張のためにもちろん機能しません。

右シフト>>を使用する代わりに、上位演算子>>>を使用する代わりに、上位演算子に下位ビットを追加することをお勧めします。例えば

1111 1111 1111 1111 1111 1111 1111 1000   
>>>1 
0111 1111 1111 1111 1111 1111 1111 1100 

ようなので...

mask = (~0 << 32-length >>> 32-length-start_pos) 

そして、あなたの最終的な答えは、になります:最も外側の回転操作はにあなたのマスクされたデータを移動

(data & (~0 << 32-length >>> 32-length-start_pos)) >>> start_pos 

下位ビット。

+0

ありがとうございました!私の質問を明確にし、あなたの答えを使用した後、私はこれを思いついた: 返信(短い)(0126) – powerj1984

+0

@ powerj1984 - OPの意味は「p」です。最下位ビットから数える。もしあなたが意味するのであれば、あなたのソリューションは機能します。最上位ビットから数える。 –

+1

他の場所で解決されたようにあなたの質問に印を付けるのがよいでしょう。すぐに、StackOverflowは未回答の質問のスタックオーバーフローになります。 – Riduidel

1

なぜ短くする必要があるのか​​わかりません。ここではlongを使った解決法があります。

public static long getBits(long data, int p, int n) { 
    assert p >= 0 && p < 64; 
    assert n >= 0 && n < 64; 
    return (data >> p) & ((1 << n) - 1); 
} 
関連する問題