2017-12-15 18 views
0

バックグラウンドでは、ブーリアントグルを使用して2つのノードの間に壁があるかどうかを判断するために、現在の迷路ハンドルを使用して迷路を構築する目的で整数パケットを渡すシステムを作成しようとしていますしたがって、私は単一の項目でパケットを送信するのではなく、それを整数の配列(長さ8)に分割して、送信する480/8のオブジェクトを与えます。ビット単位の整数変換

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

これは私が現在構築されたもので、私の考えは「_isWall」ブールのリターンに基づいて、int型で開始し、それをint型を渡すためだったとビット整数の最後に結果をシフトします。 intが容量に達すると、配列の次のintに繰り返して、迷路の壁が配列に移入されるまで再び開始します。

編集:私が尋ねていたものが明確ではありません。 ビット単位の操作で、実際に複数のビットを同じ整数に割り当てることはできませんが、どこが間違っていますか?

+0

あなたの質問はありますか? – CinCout

+0

すべてのintが8バイト長であるわけではありません。 'uint64_t'は8バイト長ですが、' CHAR_BIT == 8 '、つまりあなたのバイトが8ビット長である場合に限ります。ほとんどの場合、バイトは8ビットですが、32ビットPC、raspberri piまたはarduino用にコンパイルすると、intは64ビットにならなくなります。 – Lanting

答えて

1

val | (1UL << temp2)を使用し、temp2 << 1を使用してビットを設定しないでください。後でビット単位で&演算子を使用して、ビットが設定されているかどうかを確認することができます。バイト全体をゼロに初期化し、値が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; 
} 
関連する問題