检查字节数组中是否全是0xff

9
有没有一种简单的方法可以在不循环的情况下检查Java中的字节数组是否所有值都为0xFF?
例子:
byte[] b = new byte[]{ 0xff, 0xff, 0xff, 0xff, 0xff };

if (b is all 'ff')
    process?

3
抱歉,这是 Java 语言,而不是 C 语言。很遗憾,我认为这是不可能的(对这个愿望清单般的项目点赞 +1)。 - Jaco Van Niekerk
@JacoVanNiekerk:如果不用循环,你会如何在C语言中实现它?我所能想到的唯一方法需要'b'是固定大小且“小”的。 - Joachim Sauer
5
你不能将byte变量设置为0xff。在Java中,byte是有符号的。最大值为127(例如0x7f)。 - DRCB
@Joachim... 事实上你是对的。目前我所能想到的唯一速度提升方法是将该数组视为64位数组,循环至size/8,对每个元素进行按位与0xffffffffffffffff操作,并检查其值是否也为0xffffffffffffffff(在结尾处有一个特殊情况)。正如你所指出的,循环仍然会发生。我只是在暗示Java编译器可能无法从中获得这样的技巧。 - Jaco Van Niekerk
2
@DRCB:通过类型转换,我们可以... - Surender Thakran
显示剩余2条评论
3个回答

4
没有任何一种语言可以在没有循环(无论是显式还是递归)的情况下完成这项操作。即使您的CPU具有用于检查内存区域模式的特殊指令,它也会在内部循环。因此,您的问题实际上没有意义。
如果您正在寻找一种有效的方法来实现此操作,则有以下几种方法:
- 如果您的数组始终具有相同的长度,则可以设置常量并使用Arrays.equals()进行比较。如果您有几个不同长度但只有少数不同的数组,则可以创建几个常量。 - 您可以对数组进行排序并检查第一个和最后一个值。如果它们相同,则中间所有的值都必须为-1。 - 您可以将检查移到方法中,这意味着“检查循环”不会在重要位置混淆代码。 - 您可以使用JNI访问汇编代码,汇编代码再使用特殊指令。 - 其他语言针对此类问题提供更好的支持。在Groovy中,您可以执行b.size() == b.count { it == -1 }

3
如果您不喜欢循环,可以使用递归 :)
 public static void test1() {
    class Chk {
        boolean c(int [] b, int val, int pos) {
            if (pos >= b.length) {
                return true;
            }
            if (b[pos] != val) {
                return false;
            }
            return c(b, val, pos + 1);
        }
    }
    Chk test = new Chk();

    System.out.println(test.c(new int [] {0xff, 0xff}, 0xff, 0));

    System.out.println(test.c(new int [] {0xff, 0xff, 0xff, 0xfe}, 0xff, 0));

    System.out.println(test.c(new int [] {0x01, 0x01, 0x01, 0x01}, 0xff, 0));

    System.out.println(test.c(new int [] {0x01, 0x01, 0x01, 0x01}, 0x01, 0));
}

但递归只是循环的伪装!(就像循环只是递归的伪装一样!) - Joachim Sauer
这取决于你如何定义循环 :) - DRCB

1

疯狂的想法,你可以用字符串匹配实现它

int[] b = new int[]{0xff, 0xff, 0xff, 0xff, 0xff};
String arr = Arrays.toString(b).replaceAll(", ", "");
String match = "\\[("+new Integer(0xff).toString()+")+\\]";
System.out.println(arr);
System.out.println(match);
System.out.print(arr.matches(match));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接