以2D方式使用1D字节数组

时间:2016-09-28 16:22:48

标签: java arrays binary

我试图以2D方式使用1D字节数组,我希望能够在每个"行"中有2个字节,并且在这些行中我有少量代码,这是以下内容:

x /= 8;

这是因为我有一个带有ax和y参数的函数,x参数是字节内位的位置,y是行号,因为我想要每行两个字节,这将使每个行16位长,如果我想编辑第一行中的第二个字节,我将传递给函数,例如:10表示x值,0表示y值,这使得第一行中的第二个字节等于00100000

我用if语句实现了这个:

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

如果我输入10作为x参数8将从10中删除,因为这是一个字节,下一个字节将从左到右使用以下代码:

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

我能够用2d数组实现这个功能但是如何用1d数组实现这个目标呢?

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你只需要:

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

然后您可以使用tmp[y]访问相应的字节,x访问所需的位。

您还可以调查ByteBuffer类,它允许您将字节数组视为16位short值的数组,无论哪个&#34; endian&#34;您喜欢的格式。

答案 1 :(得分:0)

让我重新解决问题,看看它是否有帮助。假设有人需要这样的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,该API需要以特定方式构造的字节序列 - 我建议使用{ {3}}作为简单而强大的表示:

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

}