簡體   English   中英

如何編輯變量中的半字節?

[英]How to edit nibbles inside a variable?

假設我有以下代碼。

int main(int argc, char *argv[])
{
    size_t value = stoul(argv[1], 0, 16);   
    size_t nibble = stoul(argv[2]);         
    size_t replacement = stoul(argv[3]) % 16;   

    cout << hex << value << '\n';       
}

我想編寫此代碼的補充,以便我可以在終端中鍵入./a.out value nibble replacement ,並且它將通過替換替換指定半字節中的任何數字。 因此,例如,我想輸入./a.out 22334 3 11這樣我得到的輸出就是2b334 這里的半字節表示半字節偏移。 如何使程序訪問指定的半字節?

value &= ~( 0xF << ( nibble * 4 ) );
value |= replacement << ( nibble * 4 );

首先,我們創建一個蒙版。

                                           1 1 1 1   0xF

             1 1 1 1   0 0 0 0   0 0 0 0   0 0 0 0   0xF << ( nibble * 4 )

   1 1 1 1   0 0 0 0   1 1 1 1   1 1 1 1   1 1 1 1   ~( 0xF << ( nibble * 4 ) )

我們使用它來清除原始值中的位。

   0 0 1 0   0 0 1 0   0 0 1 1   0 0 1 1   0 1 0 0   value

&  1 1 1 1   0 0 0 0   1 1 1 1   1 1 1 1   1 1 1 1   mask
   -----------------------------------------------
   0 0 1 0   0 0 0 0   0 0 1 1   0 0 1 1   0 1 0 0   value & mask

然后,我們准備要插入的值。

                                           1 0 1 1   replacement

             1 0 1 1   0 0 0 0   0 0 0 0   0 0 0 0   replacement << ( nibble * 4 )

然后將其合並。

   0 0 1 0   0 0 0 0   0 0 1 1   0 0 1 1   0 1 0 0   value & mask

             1 0 1 1   0 0 0 0   0 0 0 0   0 0 0 0   replacement << ( nibble * 4 )
|  -----------------------------------------------
   0 0 1 0   1 0 1 1   0 0 1 1   0 0 1 1   0 1 0 0

您可以使用輸出流類來處理字符串。 這使得更換任何位置變得更加容易。

#include <iostream>
#include <sstream>

int main (int argc, char *argv[])
{
  std::ostringstream outstream_value;
  outstream_value << std::hex << std::stoul(argv[1], 0, 16);
  std::string hexstr = outstream_value.str();
  const std::size_t length = hexstr.length();

  std::ostringstream outstream_replace;
  outstream_replace << std::hex << std::stoul(argv[3]) % 16;
  const char replace_char = outstream_replace.str()[0];

  const std::size_t nibble = std::stoul(argv[2]);

  if ( length >= nibble + 1 )
    hexstr[length - nibble - 1] = replace_char;

  std::cout << hexstr;
  return 0;
}

暫無
暫無

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

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