2017-12-15 4 views
0

일부 배경에 대해, 두 개의 노드가 벽 사이에 벽을 가져야 할지를 결정하기 위해 부울 토글을 사용하여 미로를 작성하기 위해 정수 패킷을 전달하는 시스템을 작성하려고합니다. 현재 내 미로 핸들입니다. 480 벽, 따라서 하나의 항목으로 패킷을 보내고 싶지 않아 오히려 정수 배열 (길이 8)로 나눠 그래서 나에게 보낼 480/8 개체를 제공합니다. 이것은 내가 현재 구축 한 것입니다bitwise integer concationation

const int wallRows = mazeSize/8; 
int temp = NULL; 
int temp2 = NULL; 
int current = NULL; 
int concatCount = 0; 
int* walls = new int[wallRows]; 
int wallIndex = 0; 

for (int i = 0; i < mazeSize; i++) { 
    current = temp2; 
    //ensure my ints have only 8 bytes 
    if (concatCount >= 7) { 
     //allocate a full int to the array 
     walls[wallIndex] = temp; 
     //clear the int 
     temp = NULL; 
     //move to the next array pos 
     wallIndex++; 
     //restart the int count 
     concatCount = 0; 
    } 
    if (maze->allEdges[i]._iswall) { 
     //append a 1 to the int 
     temp = 0b1; 
    } 
    else { 
     //append a 0 to the int 
     temp = 0b0; 
    } 
    //increment the int count 
    current = (temp2 << 1) | temp; 
    concatCount++; 
} 

, 내 생각은 INT의 말에 결과를 이동, int로 시작 그것에게 부울 "_isWall"비트의 반환에 따라 INT를 통과했다. int가 용량에 도달하면 배열의 다음 int로 반복하고 미로의 벽에 배열이 채워질 때까지 다시 시작합니다.

편집 : 내가 묻는 부분에 선명도가 부족합니다. 비트 연산이 실제로 여러 비트를 같은 정수로 할당하지 못하는 것 같습니다. 어디서 잘못 되었습니까?

+0

무엇이 질문입니까? – CinCout

+0

모든 int가 8 바이트 길이는 아닙니다. 'uint64_t'는 8 바이트 길이가 될 수 있습니다 만,'CHAR_BIT == 8 ', 즉 바이트가 8 비트 길이 인 경우에만 가능합니다. 대부분 바이트는 8 비트이지만 32 비트 PC, raspberri 파이 또는 arduino 용으로 컴파일하면 int는 64 비트가되지 않습니다. – Lanting

답변

1

val | (1UL << temp2)을 사용하고 temp2 << 1을 사용하여 비트를 설정하십시오. 나중에 비트 단위로 & 연산자를 사용하여 비트가 설정되어 있는지 확인할 수 있습니다. 전체 바이트를 0으로 초기화하고 값이 true 인 경우에만 비트를 설정해야합니다. 다음은 그 예입니다.

int main(void) 
{ 
    //assign random values for testing 
    int wallinfo[480]; 
    for(int i = 0; i < 480; i++) 
     wallinfo[i] = !!(rand() % 2); 

    //copy to the values to compress 
    unsigned char compress[60] = { 0 }; 
    for(int i = 0; i < 60; i++) 
     for(int j = 0; j < 8; j++) 
      if(wallinfo[i * 8 + j]) 
       compress[i] |= 1UL << j; 

    //decompress to get back wallinfo 
    int decompress[480]; 
    for(int i = 0; i < 60; i++) 
     for(int j = 0; j < 8; j++) 
      decompress[i * 8 + j] = !!(compress[i] & (1UL << j)); 

    //wallinfo should match decompress 
    if(memcmp(wallinfo, decompress, 480) == 0) 
     printf("success\n"); 
    else 
     printf("failed\n"); 

    return 0; 
}