2016-04-05 34 views
0

私は[0,15]の各範囲の値の座標ペアを持っています。今のところ私は符号なしを使用することができますが、16 x 16 = 256の可能な合計座標位置があるので、これも1バイトのバイナリ値と16進値をすべて表します。したがって、メモリをコンパクトに保つ​​ために、BYTEまたは符号なしのcharを使用する考え方が好きです。2つの16進値を1つの16進値に結合する

座標のペアが16進値[0x05,0x0C]であるとしましょう。私は最終的な値を0x5Cにします。逆もやりたいと思っていますが、私はすでに逆の解決策で答えを見つけたと思います。私は&または|しかし、私は正しい値を得ていないために何かが欠けている。

しかし、これを入力して逆のことを見ていると、これは私が思いついたもので、動作しているようです。

byte a = 0x04; 
byte b = 0x0C; 

byte c = (a << 4) | b; 

std::cout << +c; 

そして、値は76です。 16進数に変換された値は0x4Cです。

私はこれの計算を分かっているので、より効率的な方法がありますか?

EDIT

しかし、私のような逆の操作をやっているとき、私に正しい値を与えているいくつかは、最初の2を結合する動作をテスト実行後:

byte example = c; 
byte nibble1 = 0x0F & example; 
byte nibble2 = (0xF0 & example) >> 4; 

std::cout << +nibble1 << " " << +nibble2 << std::endl; 

それはありますプリントアウト。これは正しいのですか、これが懸念すべきですか?最悪が最悪になる場合は、値の名前を変更して、それらがどの座標値であるかを示すことができます。少しのために、私はこれと逆の動作を変更する必要がありました提案の一部からこのことを考えた後

EDIT

を:

byte example = c; 
byte nibble1 = (0xF0 & example) >> 4; 
byte nibble2 = (0x0F & example); 

std:cout << +nibble1 << " " << +nibble2 << std::endl; 

そしてこれは4 12をプリントアウト私が探しているものの正しい順序!

+0

私はないと思います。 'b> 0x0F'の場合もどうなるか考えてみてください。 4ビットマスクを適用するか、何らかの方法で 'a'と' b'の両方を扱います。また、 '0x0C'は実際に' 12'です。 – LogicStuff

答えて

1

まず、実際には0..16の範囲の17の値があることに注意してください。あなたの値はおそらく0..15です。なぜなら、実際に両方が0から16の範囲にある場合、すべての可能な座標ペアを1つのバイトに一意に格納することができないからです。

あなたが提出したコード抽出は非常に効率的です。ビット演算子を使用しています。これはプロセッサに行うことが最も簡単なことです。

&を使用することを考えた場合、あなたのバイトを2つの4ビット値に分割する "逆"の場合は、あなたは正しいです。適切なタイミングで4ビットシフトを適用するだけです。

+0

はい、それらは0-15です。あなたが答えを出す前にそれを気付き、すでに編集しました。 –

+0

私は、これらの2つの計算を自分のデータ構造の1つで、座標ペアのルックアップテーブルを作成するために使用します。これらを適用する前に、すべての座標ペアを256値の配列に生成するアルゴリズムを実装する必要がありますが、順序自体は特定の構造に依存しています。私はそれに苦労してきたし、私はここでそれについての質問があります:http://stackoverflow.com/questions/36416290/implementing-a-lookup-table一度私はこのルックアップテーブルを生成することができる現在の構造体を 'byte'に変換して圧縮し、必要に応じてそれらを抽出します。 –