2012-05-14 11 views
8

Czy istnieje prosty sposób sprawdzenia bez pętli, czy tablica bajtów w java ma wszystkie wartości 0xFF jako wartości?Sprawdź, czy tablica bajtów jest w całości 0xff

przykład

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

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

Cóż ty coul w C ... oh .. Tak, to jest Java :) Niestety, Nie sądzę, że jest to możliwe (+1 dla elementu podobnego do listy życzeń). –

+0

bez pętli? Nie!! – WickeD

+0

@JacoVanNiekerk: jak zrobiłbyś to w C bez pętli? Jedyny sposób, w jaki mógłbym wymyślić, wymagałby, aby "b" było stałe i "małe". –

Odpowiedz

3

Jeśli nie podoba zapętlenie, używaj rekursji :)

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

Ale rekursja po prostu zapętla się w przebraniu! (Tak jak pętla to tylko rekursja w przebraniu!) –

+0

To zależy od tego, jak zdefiniujesz pętlę :) – DRCB

4

nie ma sposobu, aby to zrobić w dowolnym języku bez pętli (zarówno wyraźnych lub rekurencyjnych). Nawet jeśli twój procesor ma specjalne instrukcje sprawdzania obszaru pamięci dla wzorca, będzie on wewnętrznie zapętlony. Twoje pytanie nie ma sensu.

Jeśli pytasz o skuteczny sposób to zrobić, istnieją sposoby:

  • Jeśli tablice zawsze mają taką samą długość, możesz ustawić stałą i używać Arrays.equals(). Jeśli masz kilka różnych długości, ale tylko niewielką liczbę różnych, możesz utworzyć kilka stałych.

  • Możesz posortować tablicę i sprawdzić pierwszą i ostatnią wartość. Jeśli są takie same, wszystkie wartości między wartościami muszą równać się -1.

  • Możesz przenieść czek na metodę, co oznacza, że ​​"pętla kontrolna" nie zaśmieca kodu w ważnym miejscu.

  • Możesz użyć JNI, aby uzyskać dostęp do kodu asemblera, który z kolei używa specjalnych instrukcji.

  • Inne języki oferują lepszą obsługę takich rzeczy. W Groovy można zrobić b.size() == b.count { it == -1 }

1

szalony pomysł, można to zrobić z ciągiem dopasowanym

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)); 
Powiązane problemy