2017-03-02 5 views
0

저는 4 개의 기본 방향 (북쪽, 동쪽, 남쪽 및 서쪽)을 사용해야하는 Java 프로그램을 작성하고 있습니다. 내가 계속 실행하는 문제는 가능한 한 적은 메모리를 사용하는 것과 같이 각 방향을 나타내는 방법입니다. 처음에는 "North", "East", "South"및 "West"와 같이 각 방향을 나타 내기 위해 String을 사용할 수 있다고 생각 하겠지만 String 비교는 낭비적이고 실제로 필요한 모든 것이 네 개의 값인 경우에는 필요하지 않습니다. 사이를 비교하고 싶다. 말할 필요도없이, 문자열 자체만으로도이 문제의 범위를 넘어서는 좋은 메모리 덩어리를 사용합니다.4 추기경; 효율적인 메모리 표현

길이 2의 부울 []을 사용한다는 아이디어를 생각해 냈습니다. 각 방향으로 매핑 할 수있는 가능한 조합은 4 가지 (00, 01, 10 및 11)뿐입니다. 문제는 내가 부울 어레이가 메모리에서 예상했던 두 비트의 공간을 사용하지 않는다는 것입니다. 이 대답에 따르면 : SO post, 배열 최대 4 바이트의 메모리를 추가로 걸릴 수 있습니다. 내가 뭘 찾고있는 건지 ...

더 많은 검색을 한 후에 많은 게시물과 사이트가 BitSet() 객체를 제안했지만, 위의 게시물에 따르면 자바의 객체는 8 ~ 16 바이트의 메모리. 누구든지 메모리 사용량을 낮게 유지하는 측면에서이 문제에 최선의 접근 방법을 알고 있습니까? 가급적이면이 두 비트를 사용하여 추기경의 방향을 표현하는 것이 좋습니다.

정확히 두 가지 추기경과 같은 것을 표현할 수있는 방법이 있습니까? 정확히 2 비트입니까? 그렇지 않다면, 그러한 프로그램에 대한 추기경 지시의 가장 효율적인 메모리 표현은 무엇입니까?

+5

가 왜 당신에게 "메모리 효율성"대신 가독성에 대해 매우 우려하고있다? 일이 너무 복잡하여 비트 포장에 대해 걱정할 경우 Java는 잘못된 플랫폼입니다. – chrylis

+0

"메모리 사용량을 낮게 유지하는 것과 관련하여이 문제에 최선을 다하는 방법을 아는 사람이 있습니까?"같은 BitSet에 많은 수를 저장하십시오. 길이가 2N 인'BitSet '의 경우'N'방향을 저장할 수 있습니다. 'BitSet'의 저장 오버 헤드는'BitSet'이 증가함에 따라 증가하지 않습니다 (실제로 저장하는'2N' 비트의 데이터를 제외하고). –

+1

@chrylis가 암시 하듯 우선 순위가 잘못되었습니다. 이것은 _bustions_ 같은 개체를 메모리에 한 번에 저장하려고하지 않는 한 걱정해야하는 _주의 사항입니다. 어떤 시점에서이를 즉시 메모리에 두어야 할 필요가 있는지 다시 확인해야합니다. –

답변

0

각 byte [] 요소는 8 비트를 취하는 byte []를 사용할 수 있습니다. 따라서 각 바이트에 4 방향 데이터 세트를 저장할 수 있습니다. 할 수 있습니다 대신 bitshift의

1) set 0,1,2 or 3 as value for each direction (can be final static byte) 
2) depending on the insert position in the byte, use the bitshift operations to create 
    a "mask" for your operation 
3) use binary | operator to assign your value to the byte. 

, * 4/4 (곱하기 또는 나누기)도 2 비트의 자리로 이동합니다 ...