[英]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.