最近在工作中遇到了一个问题:C++的** int类型有4个字节,现在需要获取其各个字节的值,不要求各字节的值是十六进制的,十进制也可以。例如,对于 int num = 65;
,将num转为十六进制后为0x 00 00 00 41**,即其四个字节的值分别为0,0,0,与65。
比较直观的思路是调函数将十进制转为十六进制,示例代码如下:
#include <sstream>
#include <iomanip>
int num = 65;
std::stringstream ss;
ss << std::setfill('0') << std::setw(8) << std::hex << num;
std::string hex_str ss.str();
这样可以得到原数字的十六进制字符串,再遍历字符串每次取出两位并根据ASCII码做计算,如下所示:
int i = 0, temp = 0;
while (i < hex_str.size())
{
if (hex_str[i] < 'A')
temp = (hex_str[i] - '0') * 16;
else
temp = (hex_str[i] - 'A' + 10) * 16;
i++;
if (hex_str[i] < 'A')
temp += hex_str[i] - '0';
else
temp += hex_str[i] - 'A' + 10;
i++;
// temp 即为其中一个字节的结果
}
Emmmmmm写完感觉代码很丑,请教了下前辈,得到如下代码:
for (int i = 3; i >=0; i--)
{
temp = (num >> 8 * i) & 0xff;
}
位运算🐂🍺