簡體   English   中英

將2個十六進制值合並為1個十六進制值

[英]Combining 2 Hex Values Into 1 Hex Value

我有一個值的坐標對,每個值的范圍是[0,15]。 現在,我可以使用無符號,但是由於16 x 16 = 256個可能的總坐標位置,因此它也表示1字節的所有二進制和十六進制值。 因此,為了保持內存緊湊,我開始偏愛使用BYTE或未簽名的char的想法。 我要對此坐標對做的是這樣的:

假設我們有一個坐標對,其十六進制值為[0x05,0x0C],我希望最終值為0x5C。 我也想做相反的事情,但是我想我已經找到了解決反向問題的答案。 我在考慮使用&或| 但是,我缺少一些東西,因為我沒有獲得正確的值。

但是,當我鍵入此內容並查看相反的情況時:這是我想出的,它似乎正在起作用。

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

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

std::cout << +c;

且打印值為76; 轉換為十六進制的是0x4C。

既然我已經找到了計算方法,是否有更有效的方法?

編輯

在進行了一些測試之后,將前兩個結合起來的操作為我提供了正確的值,但是當我像這樣進行反向操作時:

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

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

它是打印輸出12 4 這是正確的還是應該引起關注? 如果最壞的情況發生,我可以重命名這些值以指示它們是哪個坐標值。

編輯

經過一番思考之后,根據一些建議,我不得不將反向操作修改為:

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

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

這會打印出4 12 ,這是我要查找的正確順序!

首先,請注意實際上在0..16范圍內的17個值。 您的值可能是0..15,因為如果它們的實際范圍是0到16,則將無法將每個可能的坐標對唯一存儲到一個字節中。

您提交的代碼提取效率很高,您正在使用位運算符,這是您可以要求處理器執行的最快的操作。

對於“反向”(將字節分成兩個4位值),在考慮使用&時是正確的。 只需在正確的時間應用4位移位即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM