私は[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
をプリントアウト私が探しているものの正しい順序!
私はないと思います。 'b> 0x0F'の場合もどうなるか考えてみてください。 4ビットマスクを適用するか、何らかの方法で 'a'と' b'の両方を扱います。また、 '0x0C'は実際に' 12'です。 – LogicStuff