明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2887|回复: 9

[函数] 一个包括进制任意转换的函数

[复制链接]
发表于 2011-5-11 00:15 | 显示全部楼层 |阅读模式
进制转换函数大家看得很多了吧,这个有什么特别呢?
所有常用进制的转换都写在了“一个函数”里! 你再也不必写 2to8, 8to16, 16to2.....这么多的函数了

  1. ;; 进制转换函数--专辑
  2. ;| (x!2n num from) = from 进制数值转十进制----by lxx.2005.5 ok!
  3. 参数:
  4.       num =  要转换的数值
  5.       from = 数值,表示要转换的数值的进制类型. 取值:2,8,16
  6. 返回: 转换进制后的字符串/数值.
  7. 说明: 1. 支持 类型自动识别,返回结果类型同要转换的数值类型,注意num前面要加'.
  8.       2. 支持非标准进制!
  9. 测试: (x!2n "9e" 16);;-> "158"
  10.       (x!2n '9e 16)  -> 158
  11.       (x!2n '9E 16)  -> 158
  12.       (x!2n 9E 16)  -> 6197 (错误,数值前需加')
  13.       (x!2n "64" 8);; -> "52"
  14.       (x!2n '64 8)  -> 52
  15.       (x!2n "100101" 2);;-> "37"
  16.       (x!2n '100101 2);;-> 37
  17.       (x!2n 100101 2) -> 37
  18. |;
  19. (defun x!2n  (num from / $key lst i end)
  20.   (if (not(= 'STR (type num)))
  21.     (setq num (vl-princ-to-string num) $key T)
  22.     (setq $key nil)
  23.   )
  24.   (setq lst (mapcar '(lambda (x)(if (< x 58)(- x 48)(- x 55)))
  25.       (vl-string->list (strcase num)))
  26.         i -1)
  27.   (setq end (apply '+ (mapcar '(lambda (x) (* x (expt from (setq i (1+ i)))))(reverse lst))))
  28.   (if $key end (itoa end) )
  29. )

  30. ;| (x!n2 num to) = 十进制转bas进制 -v2.0-----------by lxx.2005.10 ok!
  31. 参数:
  32.       num =  要转换的数值
  33.       to  = 数值,表示要转换成的数值的进制类型. 如:2,8,16
  34. 返回: 转换进制后的字符串/数值.
  35. 说明: 1. 支持 类型自动识别,返回结果类型同要转换的数值类型.
  36.       2. 支持非标准进制!
  37. 测试:
  38. ;; 支持 类型自动识别. 字符串类型转换结果为字符串,符号or数字类型结果为符号or数字.
  39. (x!n2 "45" 16) -> "2D"
  40. (x!n2 '45 16) -> 2D
  41. (x!n2 45 16) -> 2D
  42. (x!n2 "19" 2) -> "2011"
  43. (x!n2 '19 2)  -> 2011
  44. (x!n2 "29" 8)  ;->"35"
  45. ;; 支持非标准进制!
  46. (x!n2 29 7)  ;->41
  47. |;
  48. (defun x!n2 (num to / lst $key end)
  49.   (if (= 'STR (type num))
  50.     (setq num (atoi num) $key T)
  51.   )
  52.   (while (and (setq lst (cons (rem num to) lst))
  53.               (> (setq num (fix (/ num to))) to)))
  54.   (setq lst (cons num lst)
  55. lst (mapcar '(lambda(x)(if (<= x 9)(chr(+ 48 x))(chr(+ 55 x)))) lst))
  56.   (setq end (apply 'strcat lst))
  57.   (if $key end (read end))
  58. )
  59. ;| (x!x num from to) = 进制任意转换---ok!---by lxx.2005.10
  60. 参数:
  61.       num =  要转换的数值
  62.       from = 数值,表示要转换的数值的进制类型. 如:2,8,16
  63.       to   = 数值,表示要转换成的数值的进制类型. 如:2,8,16
  64. 返回: 转换进制后的字符串/数值.
  65. 说明: 1. 支持 类型自动识别,返回结果类型同要转换的数值类型.
  66.       2. 支持非标准进制!
  67.       3. 合并以上两个函数而成.
  68. 测试:
  69. (x!x "3a" 16 2) -> "111010"
  70. (x!x '3a 16 2) -> 111010
  71. (x!x '3a 16 12) ->4A ;;16进制转12进制.
  72. (x!x '33 4 7) -> 21 ;; 4进制转7进制. [url=mailto:33@4=15@10=21@7]33@4=15@10=21@7[/url].
  73. |;
  74. (defun x!x (num from to)
  75.   (cond
  76.     ((and (= 10 from)(= 10 to))num)
  77.     ((= 10 from)(x!n2 num to))
  78.     ((= 10 to)(x!2n num from))
  79.     (T (x!n2 (x!2n num from) to))
  80.   )
  81. )

评分

参与人数 1明经币 +1 收起 理由
革天明 + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

  • · 精髓|主题: 12, 订阅: 3
发表于 2011-5-11 00:37 | 显示全部楼层
支持一下刀
发表于 2011-5-11 01:23 | 显示全部楼层
研究研究。
发表于 2011-5-11 03:31 | 显示全部楼层
发表于 2011-5-11 09:16 | 显示全部楼层
谢谢楼主的分享
收藏了,下来学习领会
谢谢
发表于 2011-5-11 09:54 | 显示全部楼层
发表于 2011-12-23 00:57 | 显示全部楼层
好东西,谢谢分享啊
发表于 2013-5-2 06:23 | 显示全部楼层
狂刀兄的程序不错,美中不足还有点bug
(x!x 1250 10 16)  返回 400.0
(x!x 1251 10 16)  返回 4000.0
(x!x "1250" 10 16) 返回 "4E2"
(x!x "1251" 10 16) 返回 "4E3"

另外如果转换的数据量太大,会出现“8进制读取错误”的提示,再运行一次,却又好了,所以程序运行有些不稳定。
发表于 2013-12-19 17:12 | 显示全部楼层
楼主太好了 正在找这个
$(x!N2 158 2)
$2011110
条件 (> (setq num (fix (/ num to))) to))) 改成 (>= (setq num (fix (/ num to))) to)))
$(x!N2 158 2)
$10011110
发表于 2013-12-20 11:31 | 显示全部楼层
不足一位的转换要先判断num为0
(if (not (zerop num)) (setq lst (cons num lst))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-8 13:56 , Processed in 0.308216 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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