对于int型正整数可以用这种方法:
// 进行数
signed int value = 0;
// 十六进制结果
std::string result = "";
// 十六进制数字表
char hex_digits[16] = {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'a',
'b',
'c',
'd',
'e',
'f',
};
// 用do while可以支持对0的转换
do {
// 因为转换是反向取余,所以每次得出的十六进制数字要插入到最开头
result.insert(0, std::string() + hex_digits[value % 16]);
value /= 16;
} while (value > 0);
// 最后的十六进制结果
std::cout << result;
但是对于int型负数是不适用的,这个时候就需要进行一些转化
负数数据是在原基础上加上反码和补码
// 无符号异或值
signed int unsigned_xor_value = 0;
// 十六进制结果
std::string result = "";
// 十六进制数字
char Integer::hex_digits[16] = {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'a',
'b',
'c',
'd',
'e',
'f',
};
// 这个函数是用于返回十六进制数字对应的十进制数字编号
// 例如
// 2 -> 2
// f -> 15
unsigned int Integer::getHexDigitIndex(char hex_digit) {
for (signed int index = 0; index < 16; index++) {
if (hex_digit == hex_digits[index]) {
return index;
}
}
// 混入了其它字符
// 这里也可以改成异常
return -1;
}
// 进行转化,将int型十进制负数转换成int型十进制正数并加上补码
unsigned_xor_value = value ^ 0xffffffff;
// do while 可以对0进行操作
do {
result.insert(0, std::string() + hex_digits[unsigned_xor_value % 16]);
unsigned_xor_value /= 16;
} while (unsigned_xor_value > 0);
// 得到int型十进制正数并加上补码之后
// 每一位再用 f 减去位数值得到反码
// 这里从低位向高位遍历
for (signed int index = result.length() - 1; index >= 0; index--) {
// 首先通过getHexDigitIndex(result[index])获取每一位的十进制序号
// 然后再用15减去序号,对应操作是用 f 减去位数值得到反码
// 最后的出来的序号就是十六进制数字数组的下标其对应的十六进制数字
result[index] = hex_digits[15 - getHexDigitIndex(result[index])];
}
// 前面加上补码
result = "ffffffff" + result;
// 然后再截取
result = result.substr(result.length() - 8, result.length());
// 最后结果
std::cout << result;
unsigned_xor_value = value ^ 0xffffffff;
也可以替换成
abs(value + 1);