私は式を持っています:
short w = (short) ((byte) dana) << x);
...
String.format ("%04X", w);
それらが含まれている場合:
dana = (byte) 0x88;
と
int x = 5;
0xF100 を受け取る
0x1100 の代わりに
ちゃんと作るにはどうしたらいいの!
私は式を持っています:
short w = (short) ((byte) dana) << x);
...
String.format ("%04X", w);
それらが含まれている場合:
dana = (byte) 0x88;
と
int x = 5;
0xF100 を受け取る
0x1100 の代わりに
ちゃんと作るにはどうしたらいいの!
この回答を確認してください: int から byte にキャストしてからビットシフト演算子を使用する方法
あなたは(拡張記号)で始まります
1111 1111 1111 1111 1111 1111 1000 1000
そしてシフトを組む
1111 1111 1111 1111 1111 0001 0000 0000
あなたがショートにキャストすると、あなたはで終わります
1111 0001 0000 0000
これはあなたが得る結果です。
解決策はより広い値 (少なくともshort
) を使用しているため、負にはなりません。zchの答えも有効です。
問題は最初のキャストにあります:
(byte) dana
dana
は に変換されるbyte
ため、後で式で使用するときは に拡大する必要がint
あり、これは符号拡張で行われます。数値が負の場合、その値を 2 の補数に保つために、すべての上位ビットが 1 に設定されます。
代わりにビットマスクを使用してください:
short w = (short) ((dana & 0xff) << x);
short
いずれにせよ、Java はすべての演算を行うため、同様に使用しない方がよいでしょうint
。