2016-09-28 10 views
0

2次元の方法でバイトの1D配列を使用しようとしていますが、 "行"あたり2バイトを持つことができます。以下れるコードのどの:2Dの方法でバイトの1D配列を使用する

x /= 8; 

iはAXとYパラメータと機能を持っているので、これは、Xパラメータは、バイト内のビットの位置であり、Yは、行番号、として私は行ごとに16ビットの長さを作るだろうと行ごとに2バイトをしたいと私は最初の行の2番目のバイトを編集したい場合は、私は関数に渡すだろう:例えば、10のx値、0のy値第1行の第2バイトを00100000とする。

私はif文でこれを達成:

if (xBefore >= 8) { 
    xBefore -= 8; 
} 

私はXパラメータ8のために10を入力した場合には、1バイトで、次のバイトは左からの番号を取るだろうと10から除去されることを次のコードを使用してください:

tmp[y][x] |= (1 << 7 - xBefore); 

この機能を2次元配列で実現することはできますが、これを1次元配列でどうすれば達成できますか?

+0

あなたはインデックスを記述する方法は、「リトルエンディアン」の一種です。つまり、各行を16ビット値と考えると、最上位ビットはビット0です。これは、既存のコードとの相互運用性に必要ですか?そうでない場合は、異なる内部表現を使用すると操作が少しきれいになるためです。 – erickson

+0

これはどのように動作するのかのコードタイプの例を教えてください。 – user5438578

+2

はXYの問題のようです(ちょっと意図したように) – Alnitak

答えて

0

私が正しくあなたを理解していれば、あなただけの必要があります。

y *= 2; 
if (x >= 8) { 
    x -= 8; 
    y += 1; 
} 

、あなたはその後、ちょうど所望のビットにアクセスするための適切なバイトとxにアクセスするためにtmp[y]を使用することができます。

ByteBufferクラスを調べると、バイト配列を16ビットのshort値の配列として扱うことができます。いずれの "エンディアン"形式でもかまいません。

0

問題を再構成し、それが役立つかどうかを確認してください。 1は、このようなAPIを必要とします

interface BitMap { 

    /** 
    * Set or clear a flag at the given coordinates. 
    */ 
    void set(int x, int y, boolean flag); 

    /** 
    * Test whether a given coordinate is true or false. 
    */ 
    boolean get(int x, int y); 

} 

あなたが本当に例えば内部表現—気にしないのであれば、あなたはで構成バイトのシーケンスを想定し、既存のAPIに公開する必要はありません特定の方法—私はシンプルで堅牢な表現としてBitSetを使用することをお勧め:

final class BitMapImpl 
    implements BitMap 
{ 

    private final int w, h; 

    private final BitSet bits; 

    BitMapImpl(int w, int h) 
    { 
    if (w < 0) 
     throw new IllegalArgumentException("w < 0: " + w); 
    if (h < 0) 
     throw new IllegalArgumentException("h < 0: " + h); 
    this.w = w; 
    this.h = h; 
    bits = new BitSet(w * h); 
    } 

    @Override 
    public void set(int x, int y, boolean flag) 
    { 
    check(x, y); 
    int i = y * w + x; 
    bits.set(i, flag); 
    } 

    @Override 
    public boolean get(int x, int y) 
    { 
    check(x, y); 
    int i = y * w + x; 
    return bits.get(i); 
    } 

    private void check(int x, int y) 
    { 
    if (x < 0) 
     throw new IllegalArgumentException("x < 0: " + x); 
    if (x >= w) 
     throw new IllegalArgumentException("x >= w: " + x); 
    if (y < 0) 
     throw new IllegalArgumentException("y < 0: " + y); 
    if (y >= h) 
     throw new IllegalArgumentException("y >= h: " + y); 
    } 

    @Override 
    public String toString() 
    { 
    StringBuilder str = new StringBuilder(); 
    hf(str); 
    for (int y = 0; y < h; ++y) { 
     str.append('|'); 
     for (int x = 0; x < w; ++x) 
     str.append(get(x, y) ? '*' : ' '); 
     str.append('|'); 
     str.append(System.lineSeparator()); 
    } 
    hf(str); 
    return str.toString(); 
    } 

    private void hf(StringBuilder str) 
    { 
    str.append('+'); 
    for (int x = 0; x < w; ++x) 
     str.append('-'); 
    str.append('+'); 
    str.append(System.lineSeparator()); 
    } 

    /* Demonstrate usage */ 
    public static void main(String... argv) 
    { 
    BitMap map = new BitMapImpl(2, 12); 
    for (int y : new int[]{1, 2, 4, 8}) 
     for (int x = 0; x < 2; ++x) 
     map.set(x, y, true); 
    map.set(1, 6, true); 
    map.set(1, 10, true); 
    System.out.println(map); 
    } 

} 
+0

OPがバイナリデータをファイルに読み書きしていると思われます(したがって1Dバイト配列) – Alnitak

+0

'BitSet'は読みやすくするためにバイト配列との変換を行いますそして書く。 – erickson

関連する問題