私は次の方法があります:メソッドの0b1111_1111のバイト単位のビット単位の演算は何をしますか?
int convert3ByteChunkTo24Bits(final byte[] bytes) {
int bitsFor3ByteChunk = 0;
bitsFor3ByteChunk = bitsFor3ByteChunk | (bytes[0] & 0b11111111);
bitsFor3ByteChunk = bitsFor3ByteChunk << 8;
bitsFor3ByteChunk = bitsFor3ByteChunk | (bytes[1] & 0b11111111);
bitsFor3ByteChunk = bitsFor3ByteChunk << 8;
bitsFor3ByteChunk = bitsFor3ByteChunk | (bytes[2] & 0b11111111);
return bitsFor3ByteChunk & 0b00000000_11111111_11111111_11111111;
}
目的は、渡されたバイトを追加し、int型の形式でそれを返すことです。ここで私が持っている試験方法である:結果の
void testConvert3ByteChunkTo24Bits() {
final byte ca = (byte) 0xCA;
final byte fe = (byte) 0xFE;
final byte ba = (byte) 0xBA;
final byte[] man = {ca, fe, ba};
final int bytesIn24Bits = base64EncoderHelper.convert3ByteChunkTo24Bits(man);
System.out.println(bytesIn24Bits);
}
出力は次のようになります。
00000000110010101111111010111010
これは正しいです、以来、意図した結果である:バイナリである
13303482
:
0xCA = 11001010
0xFE = 11111110
0xBA = 10111010
これまでのところ良い。
int convert3ByteChunkTo24Bits(final byte[] bytes) {
int bitsFor3ByteChunk = 0;
bitsFor3ByteChunk = bitsFor3ByteChunk | (bytes[0]);
bitsFor3ByteChunk = bitsFor3ByteChunk << 8;
bitsFor3ByteChunk = bitsFor3ByteChunk | (bytes[1]);
bitsFor3ByteChunk = bitsFor3ByteChunk << 8;
bitsFor3ByteChunk = bitsFor3ByteChunk | (bytes[2]);
return bitsFor3ByteChunk & 0b00000000_11111111_11111111_11111111;
}
:私は理解していないだけで一つのこと、次のように実装があるので、もし私は、ビット単位-と操作をしない場合は、なぜ私は
(bytes[0] & 0b11111111)
のように論理的な論理積が必要なのでしょうがあります
結果は以下のようになります。
00000000111111111111111110111010
私は何をしないのですか?何が
bytes[0] & 0b11111111
ここに修正? (私は試行錯誤のようなものを見つけましたが、なぜそれは動作するのですか?)
標識拡張?値0xFFのバイトをとり、intに格納して何を得るかを観察します。 –
@ Jean-BaptisteYunèsの署名延長はどのような時点でですか? –
バイト変数は式でintに変換されるため、符号拡張されます。 –