2017-10-31 3 views
-3

まず、誰かが私のためにより良いタイトルを持っているなら、私に知らせてください。ここでC++で5ビットごとに整数値に変換する

は、私はC++

私はこの形式で表示される値の配列を持っていると自動化しようとしていますプロセスの例である: 9C07 9385 9BC7 00 9BC3 9BC7 9385

私は変換する必要がありますそれらをバイナリに変換してから5ビットごとに小数点に変換して、最後のビットをフラグにします:

ここで最初の単語だけでこれを行います。

9C07

10011 | 10000 | | 00011 | 1

19 | 16 | 3

これらは実際にはx、y、z座標であり、最後のビットは、x = 19 y = 16 z = 3、x = 16 y = 3 z = 19

私はすでにこれらの16進値でバッファを詰めていますが、ここからどこに行くのか分かりません。

+0

これを行う方法は、ビット単位の右シフト(>>)とビット単位のAND(&)です。 – Arkanosis

答えて

0

これは文字列ではなく整数リテラルであると仮定していますか?私はあまり曖昧さのために代わりに「小数」の「整数」を使用することをお勧め

#include <cstdint> 

struct Coordinate { 
     std::uint8_t x; 
     std::uint8_t y; 
     std::uint8_t z; 
     constexpr Coordinate(std::uint16_t n) noexcept 
     { 
       if (n & 1) { // flag 
         x = (n >> 6) & 0x1F; // 1 1111 
         y = (n >> 1) & 0x1F; 
         z = n >> 11; 
       } else { 
         x = n >> 11; 
         y = (n >> 6) & 0x1F; 
         z = (n >> 1) & 0x1F; 
       } 
     } 
}; 
0

次のコードは、最下位16ビットのvalue(すなわち最下位ワード)の3つの座標とフラグを抽出します。

int flag = value & 1; // keep only the least significant bit 
value >>= 1; // shift right by one bit 
int third_integer = value & 0x1f; // keep only the five least significant bits 
value >>= 5; // shift right by five bits 
int second_integer = value & 0x1f; // keep only the five least significant bits 
value >>= 5; // shift right by five bits 
int first_integer = value & 0x1f; // keep only the five least significant bits 
value >>= 5; // shift right by five bits (only useful if there are other words in "value") 

あなたの必要とするのは、配列の各単語でこれを行うループです。

関連する問題