Javaでは、右シフト演算を実行する前に、バイト型が最初にint型に変換されることを私は知っています。
したがって、Javaでは、バイトタイプの>>>操作に対して誤った答えが返されます。
例えば、
byte b=(byte)0xf1;
byte c=(byte)(b>>4);
byte d=(byte)(b>>>4);
byte e=(byte)((b&0xff)>>4);
dの答えはcに等しい。しかし、eの答えは正しいです。理由が思いつかない。
ありがとう
すでに述べたように、Javaは常にint
s以上で計算するため、
考えてみてくださいb = 1111 0001
(一番上のビットが設定されているので、b
実際には-15です)
intへの暗黙のキャスト:
(int)b = 1111 .... 1111 0001
右シフトを行う:
(b>>4) = 1111 1111 .... 1111 1111
(b>>>4) = 0000 1111 .... 1111 1111
boolへの明示的なキャスト:
c = d = 1111 1111
。
検討e=(byte)((b&0xff)>>4);
intへの暗黙のキャスト:
(int)b = 1111 .... .... 1111 0001
ANDと0xff:
x&0xff = 0000 .... 0000 1111 0001
右シフトを行う:
(b&0xff)>>4 = 0000 .... 0000 1111
バイトへの明示的なキャスト:
e = 0000 1111
javaの最小の型はintです。これは、CPUが最近整数以上の型で動作するためです。その結果、JVMはintに基づいて実装され、byte、char、booleanなどの他の小さなデータ型は便宜上追加されました。
したがって、ビット演算を行うと、前述のような矛盾を楽しむことができます。
「右シフト演算を行う前に、最初にint型に変換します」という質問に自分で答えたので、
byte e=(byte)((b&0xff)>>4);
まず第一に
b -> int => 0xfffffff1
それから
0xfffffff1 & 0xff => 0xf1
それから
0xf1 >> 4 => 0xf