itoa实现优化:将整数转化为任意进制下的字符表述

void reversestr(char* pstr)
{
    if (pstr == nullptr)
        return;
    char* pBegin = pstr;
    char* pEnd = pstr;
    while (*pEnd)
    {
        ++pEnd;
    }
    --pEnd;

    while (pEnd > pBegin)
    {
        *pBegin = *pBegin ^ *pEnd;
        *pEnd = *pBegin ^ *pEnd;
        *pBegin = *pBegin ^ *pEnd;

        ++pBegin;
        --pEnd;
    }
}
char GetChar(int num)
{
    static char numtable[16]{ '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' };
    if (num >= 0 && num < 16)
        return numtable[num];
    return '#';
}
//不要去保存返回值,其逻辑有效性在下一次调用时失效
const char* myitoa(int num,int radix) // 0x00000000~0x7FFFFFFF 绝对值范围内地正负数都可以正常显示;对于 0x80000000 计算机科学上没有显示的必要,这里显示为带符号的-0x80000000
{
    static char resout[34]{};
    char res[34]{};//二进制最多32位需要字符显示+符号字符+null字符结束
   
    bool signal = false;
    unsigned int Num = 0;
    Num = num;//如果是无符号数直接赋值
    //先转正数处理
    if (num < 0)
    {
        signal = true;
         Num = -num;//有符号数先取反再整型提升=》以一字节宽度举例 比如0xFF (-1) 取反后整型提升 还是1  但是如果直接整型提升就是255    
    }
    int i = 0;
    while (Num)//获得反序的字符串
    {
        res[i] = GetChar(Num % radix);
        Num = Num / radix;
        ++i;
    }
    if (signal)//处理符号
    {
        int size = strlen(res);
        res[size] = '-';
    }
    reversestr(res);//反转反序字符串得到正确字符串
    strcpy(resout, res);
    return resout;
}

int main()
{
    cout << myitoa(0x1a2b3c, 16) << endl;
    cout << myitoa(0x1a2b3c, 10) << endl;
    cout << myitoa(0x1a2b3c, 2) << endl;
    cout << myitoa(0x80000001, 16) << endl;
    cout << myitoa(0xFFFFFFFF, 16) << endl;
    cout << myitoa(0x80000000, 16) << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值