web-dev-qa-db-ja.com

Javaでvalue&0xffは何をしますか?

次のJavaコードがあります。

byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;

結果は印刷時に254になりますが、このコードがどのように機能するかはわかりません。 &演算子が単純にビット単位の場合、なぜバイトではなく整数になるのですか?

86
dagronlund

resultの8ビットをvalueの最下位8ビットに入れた結果の(符号なし)値にresultを設定します。

このような何かが必要な理由は、byteがJavaの署名された型だからです。書いたばかりの場合:

int result = value;

resultは、ff ff ff feではなく、値00 00 00 feになります。さらに微妙な点は、&int値でのみ動作するように定義されていることです。1、それで何が起こるかです:

  1. valueintff ff ff fe)に昇格されます。
  2. 0xffintリテラル(00 00 00 ff)です。
  3. &は、resultに必要な値を生成するために適用されます。

(ポイントは、intへの変換が発生することですbefore&演算子が適用されます。)

1まあ、そうではありません。いずれかのオペランドがlongである場合、&演算子はlong値に対しても機能します。ただし、byteではありません。 Java言語仕様のセクション 15.22.1 および 5.6.2 を参照してください。

155
Ted Hopp

から http://www.coderanch.com/t/236675/Java-programmer-SCJP/certification/xff

16進リテラル0xFFは、等しいint(255)です。 Javaは、intを32ビットとして表します。バイナリでは次のようになります。

00000000 00000000 00000000 11111111

任意の数でこの値(255)を使用してビット単位のANDを実行すると、その数の最下位8ビット(現状のまま)を除くすべてがマスク(ゼロを作成)されます。

... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101

&は%のようなものですが、 実際 ではありません。

そしてなぜ0xff?これは((2のべき乗)-1)である。すべて((2のべき乗)-1)(7、255 ...など)は、%演算子のような動作をします。

それから
バイナリでは、0はすべてゼロで、255は次のようになります。

00000000 00000000 00000000 11111111

-1は次のようになります

11111111 11111111 11111111 11111111

0xFFのビット単位のANDと0〜255の値を実行すると、結果は値とまったく同じになります。また、255を超える値がある場合、結果は0〜255の範囲内になります。

ただし、次の場合:

-1 & 0xFF

あなたが得る

00000000 00000000 00000000 11111111は、-1の元の値と等しくありません(11111111は10進数で255です)。


もう少しのビット操作:(質問とは関係ありません)

X >> 1 = X/2
X << 1 = 2X

特定のビットが設定されているか確認する(1)、または設定されていない(0)then

 int thirdBitTobeChecked =   1 << 2   (...0000100)
 int onWhichThisHasTobeTested = 5     (.......101)

 int isBitSet = onWhichThisHasTobeTested  & thirdBitTobeChecked;
 if(isBitSet > 0) {
  //Third Bit is set to 1 
 } 

Set(1)特定のビット

 int thirdBitTobeSet =   1 << 2    (...0000100)
 int onWhichThisHasTobeSet = 2     (.......010)
 onWhichThisHasTobeSet |= thirdBitTobeSet;

ReSet(0)特定のビット

int thirdBitTobeReSet =   ~(1 << 2)  ; //(...1111011)
int onWhichThisHasTobeReSet = 6      ;//(.....000110)
onWhichThisHasTobeReSet &= thirdBitTobeReSet;

XOR

XOR操作を2回実行すると、同じ値が得られることに注意してください。

byte toBeEncrypted = 0010 0110
byte salt          = 0100 1011

byte encryptedVal  =  toBeEncrypted ^ salt == 0110 1101
byte decryptedVal  =  encryptedVal  ^ salt == 0010 0110 == toBeEncrypted :)

XORを使用したもう1つのロジックは

if     A (XOR) B == C (salt)
then   C (XOR) B == A
       C (XOR) A == B

上記は、以下のようなtempなしで2つの変数を交換するのに便利です

a = a ^ b; b = a ^ b; a = a ^ b;

OR

a ^= b ^= a ^= b;
46

多くのコードを減らすのに役立ちます。 8ビットで構成されるRGB値で時々使用されます。

ここで、0xffは00000000 00000000 00000000 11111111のような24(0's)と8(1's)を意味します

変数を効果的にマスクし、最後の8ビットの値のみを残し、残りのビットをすべて無視します。

これは、色の値を特別な形式から標準のRGB値(8ビット長)に変換しようとした場合などに最もよく見られます。

すばらしい説明はこちらをご覧ください

4
Xar E Ahmer

32ビット形式のシステムでは、16進値0xff00000000000000000000000011111111、つまり10進数で255(15*16^1+15*16^0)を表します。また、ビット単位の&演算子は、第1オペランドと同じ右端の8ビットをマスクします。

0
manish kumar