2012-05-14 34 views
8

Có cách đơn giản để kiểm tra mà không lặp lại xem một mảng byte trong java có tất cả 0xFF làm giá trị không?Kiểm tra xem mảng byte có tất cả trong 0xff

dụ

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

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

Vâng trong C bạn coul ... oh .. vâng, đây là Java :) Đáng buồn thay, Tôi không nghĩ rằng đó là có thể (+1 cho mục danh sách mong muốn). –

+0

không có vòng lặp ?? Không!! – WickeD

+0

@JacoVanNiekerk: làm thế nào bạn sẽ làm điều đó trong C mà không lặp? Cách duy nhất tôi có thể nghĩ đến sẽ đòi hỏi 'b' phải có kích thước cố định và" nhỏ ". –

Trả lời

3

Nếu bạn không thích lặp, sử dụng đệ quy :)

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

Nhưng đệ quy chỉ là vòng lặp trong ngụy trang! (Cũng giống như looping chỉ là đệ quy trong ngụy trang!) –

+0

Nó phụ thuộc vào cách bạn xác định looping :) – DRCB

4

Không có cách nào để làm điều đó bằng ngôn ngữ nào mà không cần vòng (hoặc rõ ràng hoặc đệ quy). Ngay cả khi CPU của bạn có một hướng dẫn đặc biệt để kiểm tra một vùng nhớ cho một mẫu, nó sẽ lặp lại nội bộ. Vì vậy, câu hỏi của bạn không thực sự có ý nghĩa.

Nếu bạn đang yêu cầu cho một cách hiệu quả để thực hiện điều này, có nhiều cách:

  • Nếu mảng của bạn luôn luôn có cùng độ dài, bạn có thể thiết lập một hằng số và sử dụng Arrays.equals(). Nếu bạn có nhiều độ dài khác nhau nhưng chỉ có một số lượng nhỏ các độ dài khác nhau, bạn có thể tạo một số hằng số.

  • Bạn có thể sắp xếp mảng và kiểm tra giá trị đầu tiên và cuối cùng. Nếu chúng giống nhau, thì tất cả giá trị giữa phải bằng -1.

  • Bạn có thể di chuyển séc vào một phương thức, có nghĩa là "vòng kiểm tra" không làm lộn xộn mã ở một vị trí quan trọng.

  • Bạn có thể sử dụng JNI để truy cập mã bộ mã hóa mà lần lượt sử dụng các hướng dẫn đặc biệt.

  • Các ngôn ngữ khác cung cấp hỗ trợ tốt hơn cho những việc như thế này. Trong Groovy, bạn có thể làm ý tưởng b.size() == b.count { it == -1 }

1

điên, bạn có thể làm điều đó với chuỗi phù hợp với

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)); 
Các vấn đề liên quan