2011-07-14 10 views
1

私の問題はこのようなものです。Javaのバイト値をマスクする方法は?

私はJavaでバイト単位で計算しています。いくつかの計算では、私はバイト値で "2a"の私の希望結果を得るが、私はバイト値で "ffffff9a"を得るいくつかの計算で。私は結果 "ffffff9a"から "9a"の値を入れたいだけです。私はこれを試みたが、うまくいかなかった。

byte a = (byte) b & 0xff; 

ここで、bは値 "ffffff9a"バイト値です。

しかし、同じプロセスを表示すること

私が間違っているつもりです
System.out.println(Integer.toHexString(b & 0xff)); 

のように動作している間?私の希望する価値を得るために何ができますか?

おかげ


は、実際に私は、GSM 7ビットに8ビット文字を変換しようとしています。また、誰かがこれを手伝ってくれれば、それも助けになるだろう。文字列はバイト配列として格納され、この文字列または8ビットバイトを7ビットに変換する必要があります。

+0

コードは正しく表示されますが、正しくテストしていますか?たぶん全体のルーチンを表示する?また、 'b'はバイト型ですか? – fileoffset

+0

System.out.println(Integer.toHexString(0xffffff9a&0xff)); '9a' http:// ideoneを出力します。com/ikxuO –

+0

はいbはタイプバイトで、印刷は問題ありません。変数に値を格納したいところです。問題は – bunkdeath

答えて

7

Javaのbyteタイプは、と署名されています。範囲は[-128、127]です。

System.out.println(Integer.toHexString(a & 0xff)); // note a, not b 

タイプbyteであるにもかかわらずaを、 "正しい値" を示すであろう、は((byte)0x92)が負の値を含むであろう。つまり(int)a == 0x92は、intへのキャストがの値を負とすべての値に維持するため、(a & 0xff) == 0x92がtrueになるため、falseになります。これは、ビットワイズ&int型に式を昇格させ、「符号ビット」をマスクしながら(実際には符号ビットではなく、2の補数のアーチファクト)昇格するためです。

参照:Java How To "Covert" Bytes

ハッピーコーディング。

+0

ありがとうpst、それは参考になりました。 – Sumit

2

あなたの最初のコードはでした:byte a = (byte) b & 0xff;

(byte)型キャストは、すでにbyteである、bに適用されます。 &演算子をintに広げて、intから結果 "ffffff9a"を得ました。

あなたは型キャストだけでなく、その最初のオペランドに、&の結果に適用されることを保証する必要があります。括弧の余分なペア

byte a = (byte)(b & 0xff);

注意。

+0

私もそれを試しましたが(余分な括弧)、結果は同じです。 – bunkdeath

0
//bit is zero base 
public static boolean isSet(byte value, int bit) 
{ 
    int b = (int)value & 0xff; 
    b >>= bit; 
    b &= 0x01; 
    if(b != 0) 
    { 
     return true; 
    } 
    return false; 
} 
public static byte setBit(byte value, int bit) 
{ 
    int b = (int)value; 

    b |= (1 << bit); 
    return (byte)(b & 0xff); 
} 
public static byte clearBit(byte value, int bit) 
{ 
    int b = (int)value; 

    b &= ~(1 << bit); 
    return (byte)(b & 0xff); 
} 
関連する問題