硬汉嵌入式论坛

 找回密码
 立即注册
查看: 878|回复: 4
收起左侧

[算法] 分析各有意思的itoa实现

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2023-5-30 14:14:46 | 显示全部楼层 |阅读模式

这句话*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 +(tmp_value - value * base)];很有意思

[C] 纯文本查看 复制代码
/**
	 * C++ version 0.4 char* style "itoa":
	 * Written by Lukás Chmela
	 * Released under GPLv3.
	 */
char *itoa(int value, char *result, int base) {
    // check that the base if valid
    if (base < 2 || base > 36) {
        *result = '\0';
        return result;
    }

    char *ptr = result, *ptr1 = result, tmp_char;
    int tmp_value;

    do {
        tmp_value = value;
        value /= base;
        *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 +
                                                                                           (tmp_value - value * base)];
    } while (value);

    // Apply negative sign
    if (tmp_value < 0) *ptr++ = '-';
    *ptr-- = '\0';
    while (ptr1 < ptr) {
        tmp_char = *ptr;
        *ptr-- = *ptr1;
        *ptr1++ = tmp_char;
    }
    return result;
}
回复

使用道具 举报

8

主题

157

回帖

181

积分

初级会员

积分
181
发表于 2023-5-30 15:19:20 | 显示全部楼层
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
 楼主| 发表于 2023-5-30 15:34:35 | 显示全部楼层
yunqi 发表于 2023-5-30 15:19
https://www.armbbs.cn/forum.php?mod=viewthread&tid=117479&extra=

回复

使用道具 举报

2

主题

268

回帖

274

积分

高级会员

积分
274
发表于 2023-5-30 19:13:27 | 显示全部楼层
我个人比较菜用gpt解释了一波内容如下,如果大佬们提点下应用场景就更香了。

这是一个 C++ 中将数字转换成字符串的函数,使用 char* 类型的输出结果。具体解释如下:

char *itoa(int value, char *result, int base):这行代码定义了一个函数 itoa,它有三个输入参数,分别为需要转换成字符串的数字 value,转换结果存放的位置 result 和 value 在转换过程中所用的进制 base。

if (base < 2 || base > 36):这行代码检查转换进制 base 是否在可接受范围内(2 到 36 之间),若不在则返回空字符串。

char *ptr = result, *ptr1 = result, tmp_char;:这行代码定义了三个变量,分别是字符串输出的指针 ptr,字符串开头的指针 ptr1 和中间变量 tmp_char。

do { ... } while (value);:这是一个 do-while 循环,它会执行若干次,直到 value 的值为 0,也就是说,它会将数字 value 转换成字符串 char* 类型的结果,存放在 result 中。

tmp_value = value;:将 value 的值保存到 tmp_value 中,以便后续计算。

value /= base;:将 value 的值对 base 取整并赋值给 value 自身,以便下一次计算。

*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];:这行代码将 tmp_value 每一位转换成对应的字符,并存储到 result 指向的内存地址中,这里用到了字符数组中元素的下标。

if (tmp_value < 0) *ptr++ = '-';:若最后一个除法计算的结果小于 0,说明此时数字已经被转换成了负数,将负号加入到结果字符串中。

*ptr-- = '\0';:在结果字符串的最后一个位置加上字符串结束标志 \0。

while (ptr1 < ptr) { ... }:这个循环将之前存储在 result 中的字符倒序排列,以得到正确的结果。这里用到了两个指针变量 ptr 和 ptr1,它们在循环中同时移动。

return result;:将转换结果 result 返回。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
 楼主| 发表于 2023-5-30 19:21:21 | 显示全部楼层
cctv180 发表于 2023-5-30 19:13
我个人比较菜用gpt解释了一波内容如下,如果大佬们提点下应用场景就更香了。

这是一个 C++ 中将数字转换 ...

谢谢分享,就是这种查表法很有意思,楼上的坛友之前还发过这个东西,我还以为是个错误。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 03:51 , Processed in 0.196810 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表