2012-05-14 57 views
8

有沒有一種簡單的方法來檢查沒有循環java中的字節數組是否具有全部0xFF值?檢查字節數組是否都在0xff

例如

byte[] b = new byte[]{ 0xff, 0xff, 0xff, 0xff, 0xff }; 

if (b is all 'ff') 
    process? 
+3

井c您不需經過...哦..是的,這是Java的:)遺憾的是,我不認爲這是可能的(類似願望清單項目的+1)。 –

+0

沒有循環?沒有!! – WickeD

+0

@JacoVanNiekerk:你如何在C中不使用循環?我能想到的唯一方法是需要「b」是固定大小的「小」。 –

回答

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)); 
} 
+0

但遞歸只是變相循環! (就像循環只是變相的遞歸!) –

+0

這取決於你如何定義循環:) – DRCB

4

有沒有辦法做到這一點在任何語言中沒有循環(顯式或遞歸)。即使你的CPU有一個特殊的指令來檢查一個模式的內存區域,它也會在內部循環。所以你的問題沒有意義。

如果你問一個有效的方式做到這一點,也有辦法:

  • 如果你的數組總是有相同的長度,你可以設置一個常數,並使用Arrays.equals()。如果你有幾種不同的長度,但只有少數不同的長度,你可以創建幾個常量。

  • 您可以對數組進行排序並檢查第一個和最後一個值。如果它們相同,則所有值之間的值也必須爲-1。

  • 您可以將支票移動到方法中,這意味着「檢查循環」不會在重要的地方混亂代碼。

  • 您可以使用JNI訪問彙編代碼,然後使用特殊指令。

  • 其他語言提供更好的支持這樣的事情。在Groovy中,你可以做b.size() == b.count { it == -1 }

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));