私は次のJavaコードを持っています:
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
印刷すると254になりますが、このコードがどのように機能するのかわかりません。演算子が単純にビット単位である場合&
、なぜそれがバイトではなく整数になるのでしょうか。
私は次のJavaコードを持っています:
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
印刷すると254になりますが、このコードがどのように機能するのかわかりません。演算子が単純にビット単位である場合&
、なぜそれがバイトではなく整数になるのでしょうか。
の下位 8 ビットにresult
の 8 ビットを入れた結果の (符号なし) 値に設定します。value
result
このようなものが必要な理由byte
は、Java では符号付きの型だからです。あなたがちょうど書いた場合:
int result = value;
の代わりにresult
値になります。さらに微妙な点は、が値1でのみ動作するように定義されているため、次のようになります。ff ff ff fe
00 00 00 fe
&
int
value
int
( )に昇格されff ff ff fe
ます。0xff
int
リテラル ( 00 00 00 ff
) です。&
目的の値を得るために が適用されますresult
。(ポイントは、演算子が適用される前にへの変換が行われるint
ことです。)&
1まあ、そうではありません。いずれかのオペランドが である場合、演算子は値に対しても&
機能します。しかし、そうではありません。Java 言語仕様のセクション15.22.1および5.6.2を参照してください。long
long
byte
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 ビットを除くすべてがマスクされます (0 になります) (そのままになります)。
... 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 と 0 ~ 255 の任意の値のビットごとの AND を実行すると、結果は値とまったく同じになります。値が 255 を超える場合でも、結果は 0 ~ 255 の範囲内になります。
ただし、次の場合:
-1 & 0xFF
あなたが得る
00000000 00000000 00000000 11111111
、元の値の -1 と等しくありません ( 11111111
10 進数で 255 です)。
さらにいくつかのビット操作: (質問とは関係ありません)
X >> 1 = X/2
X << 1 = 2X
特定のビットが設定されているか (1)、設定されていないか (0) を確認してから、
int thirdBitTobeChecked = 1 << 2 (...0000100)
int onWhichThisHasTobeTested = 5 (.......101)
int isBitSet = onWhichThisHasTobeTested & thirdBitTobeChecked;
if(isBitSet > 0) {
//Third Bit is set to 1
}
特定のビットをセット(1)する
int thirdBitTobeSet = 1 << 2 (...0000100)
int onWhichThisHasTobeSet = 2 (.......010)
onWhichThisHasTobeSet |= thirdBitTobeSet;
特定のビットをリセット (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;
また
a ^= b ^= a ^= b;
32 ビット形式のシステムでは、16 進数値は10 進数を0xff
表します。ビットごとの & 演算子は、最初のオペランドと同じ右端の 8 ビットをマスクします。00000000000000000000000011111111
255(15*16^1+15*16^0)