113

私は次のJavaコードを持っています:

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

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

4

4 に答える 4

183

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

このようなものが必要な理由byteは、Java では符号付きの型だからです。あなたがちょうど書いた場合:

int result = value;

の代わりにresult値になります。さらに微妙な点は、が値1でのみ動作するように定義されているため、次のようになります。ff ff ff fe00 00 00 fe&int

  1. valueint( )に昇格されff ff ff feます。
  2. 0xffintリテラル ( 00 00 00 ff) です。
  3. &目的の値を得るために が適用されますresult

(ポイントは、演算子が適用される前にへの変換が行われるintことです。)&

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

于 2012-07-08T01:50:03.120 に答える
66

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 と等しくありません ( 1111111110 進数で 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;
于 2014-05-22T08:32:50.923 に答える
0

32 ビット形式のシステムでは、16 進数値は10 進数を0xff表します。ビットごとの & 演算子は、最初のオペランドと同じ右端の 8 ビットをマスクします。00000000000000000000000011111111255(15*16^1+15*16^0)

于 2015-05-03T17:59:03.833 に答える