循环字节数组仅适用于[关闭]

Posted

技术标签:

【中文标题】循环字节数组仅适用于[关闭]【英文标题】:Loop array of bytes only for ones [closed] 【发布时间】:2016-04-05 07:54:48 【问题描述】:

我有一个字节数组。有些是 0,有些是 1。

import java.util.Arrays;

byte[] bytes = new byte[100];

我只想循环 1。如何做到这一点?

【问题讨论】:

1 是什么意思? 循环遍历数组并使用if 条件对1 进行处理。 字节不是比特,如果你的意思是这样的话 我不想在所有数组上循环,因为它的尺寸很大。我想循环数组中值为 1 的项目并丢弃值为 0 的项目 你不能。如果你想过滤和排列你必须至少检查一次数组。这不能少于 o(n)。 【参考方案1】:

我不想在所有数组上循环,因为它的大小很大。我

实际上 100 个字节是微不足道的。它使用 2 个缓存行。但是,如果您想提高性能,您可以使用一个位集,每个 0 或 1 仅使用一位而不是 8。

BitSet bs = new BitSet(1 << 20); // 1 Mb
for(int i = 0; (i = bs.nextSetBit(i+1)) >= 0;)
    System.out.println("Next set bit is " + i);

这仍然需要循环遍历数据,但它可以一次检查 64 位。

【讨论】:

如果数组非常大,我可以减少循环它的时间吗? 谢谢彼得。我实际上并不是说 100 个项目,我有时大约有 100000000 个项目。BitSet 的代码是否会尽可能减少时间 @andolsizied 虽然测试存在缺陷,但根据具体情况,您可能是对的。 +1【参考方案2】:

带有测试的 for 循环应该可以解决问题。

    BitSet bs = new BitSet(100000000); 
    for (int i = 0; i < 100000000; i++) bs.set(i);
    long stDate = System.currentTimeMillis();
    for (int i = 0; (i = bs.nextSetBit(i + 1)) >= 0;) // TODO
    long endDate = System.currentTimeMillis();
    System.out.println(endDate - stDate);

    byte[] bytes = new byte[100000000];
    for (int i = 0; i < 100000000; i++) bytes[i] = 1;
    stDate = System.currentTimeMillis();
    for (byte b : bytes)   if (b == 1) // TODO
    endDate = System.currentTimeMillis();
    System.out.println(endDate - stDate);

【讨论】:

我怀疑您正在遭受大量死代码消除的困扰。顺便说一句 new Date().getTime()System.currentTimeMillis() 相同 感谢指正,不影响结果。

以上是关于循环字节数组仅适用于[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

复制/设置 Memory<byte> 中的单个字节

循环遍历数组对象以检查值匹配仅适用于第一次迭代,后续迭代失败

C++ memset 是不是仅适用于 0 和 -1? [关闭]

使用适用于 android 的字节播放声音

AltiVec vec_ld() 是不是仅适用于 16 字节对齐的变量?

字节数组是啥意思? [关闭]