我试图以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数组实现这个目标呢?
答案 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);
}
}