2012-05-14 16 views
8

Javaのバイト配列にすべて0xFFがあるかどうかをループなしでチェックする簡単な方法はありますか?バイト配列がすべて0xffに入っているかどうかを調べる

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

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

にマッチする文字列でそれを行うことができます...ああ...はい、これは、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

クレイジーなアイデアを行うことができます、あなたはクーロンCでまあ

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)); 
関連する問題