C++实现int型十进制数转十六进制数

对于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);

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值