ビット演算は、ビット単位で以下の質問は、Java
-
05-09-2019 - |
質問
私は数行のコード内のプロジェクトが見えないことに気づいたの値の---
buffer[i] = (currentByte & 0x7F) | (currentByte & 0x80);
読み込んで、filebufferからファイルとして格納されたバイト、そしてバッファー[i]とができないか全体の目的は、そのアイデア?
感謝
解決
他の回答はすでに述べたように、(currentByte & 0x7F) | (currentByte & 0x80)
が(currentByte & 0xFF)
と同等です。 JLS3 15.22.1 にこれが促進されると言いますint
へ:
場合演算子&両方のオペランド ^、または|あるタイプのものです 原始的に(5.1.8)コンバーチブル 整数型、バイナリ数値 プロモーションは、最初に実行されます オペランド(5.6.2)。タイプ ビット単位の演算子式であります オペランドのタイプを推進します。
JLS3 5.6.2 には述べていますので、 currentByte
はbyte
型を持つと0x7F
がint
である(これはそうである)場合、両方のオペランドがint
に昇格されます。
したがって、buffer
要素型int
又は幅広の配列になります。
次に、& 0xFF
にint
を行うことにより、我々は効果的に符号なし範囲0..255、しばしば例えばbyte
ストリームによって使用される動作にオリジナルjava.io
範囲-128..127をマッピングする。
次のコードスニペットでこの動作を確認することができます。 として、あなたはchar
除き、そのJava店整数型を知っている必要があり、ここで何が起こっているかを理解するためになお値の2の補数ます。
byte b = -123;
int r = b;
System.out.println(r + "= " + Integer.toBinaryString(r));
int r2 = b & 0xFF;
System.out.println(r2 + "= " + Integer.toBinaryString(r2));
最後に、実際の例のために、read
のjava.io.ByteArrayInputStream
方法のJavadocのと実装をチェックしてください
/**
* Reads the next byte of data from this input stream. The value
* byte is returned as an <code>int</code> in the range
* <code>0</code> to <code>255</code>. If no byte is available
* because the end of the stream has been reached, the value
* <code>-1</code> is returned.
*/
public synchronized int read() {
return (pos < count) ? (buf[pos++] & 0xff) : -1;
}
他のヒント
(currentByte & 0x7F) | (currentByte & 0x80)
タグに相当します
currentByte & (0x7F | 0x80)
等しい
currentByte & 0xFF
と全く同じです
currentByte
編集:私は唯一の割り当ての右側に見て、私はまだequivalanceが本当だと思います。
。しかし、コードが符号なしとしてバイトを解釈しながら、より大きなタイプに符号付きバイトをキャストしたいように思えます。
Javaで符号なしに署名バイトをキャストする簡単な方法はありますか?
思いったと考えすぎ。ではないからだ。
私も一言
- は原著作者のことが心配にな実行時に置き換えバイトとネイティブの署名の整数(おそら32ビット)および明示的にうであったことは、符号ビットが"特別"?
このコードを残す。いま、怪し実行はどのようなものがありますか。どのタイプのバッファ'。
に複雑なビット単位の論理が全く不要です。
for (int i = 0; i < buffer.length; i++) {
buffer[i] = filebuffer[currentPosition + i] & 0xff;
}
は同じものだと言ってもいいです。の場合バッファーとして宣言されたバイト配列までの&0xffが、残念ながらの宣言については記載しておりません。
の理由の独自開発した混乱によるバイトの契約が締結されるJava.
ビット単位のAND演算の結果は、ボットビットのどちらか一方が1である。
その上のビット単位のOR演算HASE Aの結果がビットながら、両方のビットが1である場合、そのビットに1を有していますだから、たとえば評価値0x65ます:
01100101 0x65
& 01111111 0x7F
===============
01100101 0x65
01100101 0x65
& 10000000 0x80
===============
00000000 0x00
01100101 0x65
| 00000000 0x00
===============
01100101 0x65
良いこと:あなたはすべての可能な組み合わせ(それらのすべて256)を試してみて、あなたが期待される答えを得ることを確認することができます。
。、バイトは符号付きビット表記であったから読み出されたファイルが判明し、保持したまま、異なる長さ、したがって、それは、Java int型に拡張することができるようにするには、このタスクを実行するためにrequriedましたその正しい記号:)