次のJavaコードがあります。
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
結果は印刷時に254になりますが、このコードがどのように機能するかはわかりません。 &
演算子が単純にビット単位の場合、なぜバイトではなく整数になるのですか?
result
の8ビットをvalue
の最下位8ビットに入れた結果の(符号なし)値にresult
を設定します。
このような何かが必要な理由は、byte
がJavaの署名された型だからです。書いたばかりの場合:
int result = value;
result
は、ff ff ff fe
ではなく、値00 00 00 fe
になります。さらに微妙な点は、&
がint
値でのみ動作するように定義されていることです。1、それで何が起こるかです:
value
はint
(ff ff ff fe
)に昇格されます。0xff
はint
リテラル(00 00 00 ff
)です。&
は、result
に必要な値を生成するために適用されます。(ポイントは、int
への変換が発生することですbefore&
演算子が適用されます。)
1まあ、そうではありません。いずれかのオペランドがlong
である場合、&
演算子はlong
値に対しても機能します。ただし、byte
ではありません。 Java言語仕様のセクション 15.22.1 および 5.6.2 を参照してください。
から 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;
多くのコードを減らすのに役立ちます。 8ビットで構成されるRGB値で時々使用されます。
ここで、0xffは00000000 00000000 00000000 11111111
のような24(0's)と8(1's)を意味します
変数を効果的にマスクし、最後の8ビットの値のみを残し、残りのビットをすべて無視します。
これは、色の値を特別な形式から標準のRGB値(8ビット長)に変換しようとした場合などに最もよく見られます。
32ビット形式のシステムでは、16進値0xff
は00000000000000000000000011111111
、つまり10進数で255(15*16^1+15*16^0)
を表します。また、ビット単位の&演算子は、第1オペランドと同じ右端の8ビットをマスクします。