次のようなバイト配列があります。
byte[] array = new byte[] { 0xAB, 0x7B, 0xF0, 0xEA, 0x04, 0x2E, 0xF3, 0xA9};
タスクは、その中の「0xA」の出現数を見つけることです。何をすべきか教えていただけますか?答えは6です。
配列全体を単一のビット文字列として扱う場合:
0xAB, 0x7B, 0xF0, 0xEA, 0x04, 0x2E, 0xF3, 0xA9 is then:
10101011 01111011 11110000 11101010 00000100 00101110 11110011 10101001
==== ==== ====
==== ==== ====
これには 1010 が 6 回発生します。
バイト境界を越えて一致させようとしない場合は、次のようなことを試すことができます (Perl でテストし、手動で変換):
int counter = 0;
for (int i = 0; i < array.length; ++i)
{
for (int bits = 0xA0, mask = 0xF0; bits >= 0x0A; bits >>= 1, mask >>= 1)
{
if ((array[i] & mask) == bits)
++counter;
}
}
バイト境界を越えて一致させるには、次のバイトからビットをシフトする必要があります。次のようなものを試してください (Perl でテストし、手作業で翻訳しました):
int counter = 0;
byte tester = array[0];
for (int i = 1; i < array.length + 1; ++i)
{
byte nextByte = i < array.length ? array[i] : 0;
for (int bit = 0; bit < 8; ++bit)
{
if ((tester & 0xF0) == 0xA0)
++counter;
tester <<= 1;
if ((nextByte & 0x80) != 0)
tester |= 1;
nextByte <<= 1;
}
}
この例では、バイト境界をまたがる 1010 シーケンスがないため、両方のプログラムで 6 とカウントされます。
したがって、コメントから、1010
配列内のバイトにビットパターンが出現した合計数が必要です。
特定のバイトb
の場合、カウントは次の合計です。
(b & 0x0A) == 0x0A ? 1 : 0
(b & 0x14) == 0x14 ? 1 : 0
(b & 0x28) == 0x28 ? 1 : 0
(b & 0x50) == 0x50 ? 1 : 0
(b & 0xA0) == 0xA0 ? 1 : 0
(演習として残します: これは何をしているのですか?)
これを関数に入れて、配列内の各バイトに対して呼び出し、結果を合計します。