2016-09-28 3 views
0

2 차원 방식으로 1D 배열을 사용하려고하는데 "행"당 2 바이트를 가질 수 있기를 원하며이 행에는 소량이 있습니다.2D 방식의 1D 배열 사용

난 AX와 Y 파라미터로하는 기능을 가지고 있기 때문이다
x /= 8; 

는 x 매개 변수가 바이트 내부에 비트 위치이고, y는 행 번호이고, 등 : 다음 코드 된 나는 행 당 2 바이트를 원한다. 각 행은 16 비트 길이가 될 것이고 첫 번째 행에서 두 번째 바이트를 편집하려면 함수에 전달할 것이다. 예를 들어 x 값 10, y 값 0 제 1 행의 제 2 바이트는 00100000이된다.

,

난 if 문으로이를 :

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

즉 그 하나의 바이트이고 왼쪽에서 다음 바이트 수를 취할 것 같은 파라미터 (8) (10)로부터 제거 될 수있는 X 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; 
} 

당신은 그럼 그냥 적절한 바이트에 액세스 할 수 tmp[y]을 사용할 수 있으며 x 원하는 비트에 액세스 할 수 있습니다.

ByteBuffer 클래스를 조사하여 바이트 배열을 16 비트 short 값의 배열로 선호하는 "endian"형식으로 처리 할 수 ​​있습니다.

0

문제를 다시 골라내어 도움이되는지 확인해보십시오. 당신이 정말로 예를 들어 내부 표현 — 신경 쓰지 않는 경우

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를 필요로한다고 가정 나는 간단하고 강력한 표현으로 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

관련 문제