我有一个字节数组,如下所示:
byte[] array = new byte[] { 0xAB, 0x7B, 0xF0, 0xEA, 0x04, 0x2E, 0xF3, 0xA9};
任务是找到其中出现次数“0xA”。 你能告诉我该怎么办?答案是6。
答案 0 :(得分:0)
如果将整个数组视为单个位串:
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;
}
}
两个程序都计数为6,因为在这个例子中,字节边界没有1010个序列。
答案 1 :(得分:0)
因此,根据您的评论,您需要数组中字节中位模式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
(作为练习留下:这是做什么的?)
将它放在一个函数中,为数组中的每个字节调用它,对结果求和。