回 帖 发 新 帖 刷新版面

主题:关于数制转换

有不少人都研究了怎么样加快数制转换速度的问题
有很快的是把输入数转换成16进制内码,然后select,这样是很快
我的想法是
需要转换的数一定要放在一个变量里,假设这个变量为a,我们在用户输入完毕后,寻找a的地址,得到的肯定是个256进制的数,也就是以位为单位的一个数
这样可以用select直接转换,省去了中间的一步,应该能快一点吧
哪位老大能告诉我,这个想法对不对呢???

回复列表 (共8个回复)

沙发

不对,
QB本身就有转换函数,
搞那么多事情干嘛来着?

板凳

我是纯研究态度的
因为大批的数据转换需要单次的速度提高
比方说我在文曲星操作显存时就需要大批的转换数制

3 楼

你需要的是什么进制转成什么进制?
是做什么用的?
没有 hex$ 和 oct$ 吗?
有必要那么麻烦吗?
没有其他替代办法吗?

4 楼

转成2进制的
因为文曲星不提供读点功能
只能把显存里的10进制数据转换成2进制才能判断某个点是否点亮

5 楼

为什么要判断某个点?
你怎样判断?

用 and 2^x 不行吗?
为什么非得转换一次?

非得要显示出来的话,
那就循环 \2 , mod 2 就可以了
一般的编译器都懂得把它们译成移位操作,
这样的速度就快多了.
至于那些先转换16进制再转的方法,只是方便阅读和人工转换的,不是给电脑用的,
放地址去再拿出来操作的事情叫做迂回战术,南辕北辙.没这个必要吧?

6 楼

你不知道啊,文曲星那个编译器很垃圾,经常出莫名其妙的错误
而且肯定也不是自动移位的,因为我亲眼看到他算得慢

7 楼

'这是一个考虑到正负数和小数因素的二进制转十进制程序,同时考虑了输入格式判断
CLS : flag = 1: INPUT a$
FOR i = 1 TO LEN(a$)
  c$ = MID$(a$, i, 1)
  IF c$ <> "1" AND c$ <> "0" AND c$ <> "-" AND c$ <> "." THEN PRINT "Reinput!": END
  IF c$ = "." THEN nc = nc + 1: IF nc > 1 THEN PRINT "reinput": END
  IF c$ = "-" AND i <> 1 THEN PRINT "reinput": END
NEXT i  
 '以上为判断输入格式
a = INSTR(a$, ".")
IF a <> 0 THEN
   a1$ = MID$(a$, 1, a - 1): a2$ = MID$(a$, a + 1, LEN(a$) - a + 1)
ELSE
   a1$ = a$: a2$ = "0"
END IF
'以上分割整数和小数部分
IF MID$(a1$, 1, 1) = "-" THEN a1$ = MID$(a1$, 2, LEN(a1$) - 1): PRINT a1$: flag = -1
b = 0: K = 0
FOR i = LEN(a1$) TO 1 STEP -1
  b = b + VAL(MID$(a1$, i, 1)) * 2 ^ K: K = K + 1
NEXT i
K = 0
FOR i = 1 TO LEN(a2$)
  K = K + 1: b = b + VAL(MID$(a2$, i, 1)) * 2 ^ (-K)
NEXT i
b = b * flag
'以上为求值部分
PRINT a$; "="; b
END

8 楼

'2=<n,m<36,n进制转m进制,保留x位小数(没考虑四舍五入)。程序存在两个问题,请不怕麻烦的读者自行解决。另,回复得急,未经严格测试,可能有问题,仅起到抛砖引玉的作用。
CLS : flag$ = "+": INPUT a$, n, m, x: a = INSTR(a$, ".")
FOR i = 1 TO LEN(a$)
   c$ = MID$(a$, i, 1)
   IF (c$ < "0" AND c$ <> "+" AND c$ <> "-" AND c$ <> ".") OR (c$ > "9" AND c$ < "A") OR c$ > "Z" THEN PRINT "Reinput": END
   IF i <> 1 AND (c$ = "-" OR c$ = "+") THEN PRINT "Reinput": END
   IF c$ = "." THEN idat = idat + 1: IF idat > 1 OR i = 1 OR i = i THEN PRINT "Reinput": END
'以上判断输入格式部分仍存在着问题,就是当源数据是N进制时,输入的a$中的任意字符不能超过N。这部分只要参照后面的语句,定个界即可,故这里就不麻烦了。
NEXT i
IF a <> 0 THEN
   a1$ = MID$(a$, 1, a - 1): a2$ = MID$(a$, a + 1, LEN(a$) - a + 1)
ELSE
   a1$ = a$: a2$ = "0"
END IF
'以上是分解整数和小数部分
IF MID$(a1$, 1, 1) = "-" THEN a1$ = MID$(a1$, 2, LEN(a1$) - 1): flag$ = "-"
'该语句判断正负号
ba1 = 0: k = 0
FOR i = LEN(a1$) TO 1 STEP -1
  c$ = MID$(a1$, i, 1)
  IF c$ >= "A" AND c$ <= "Z" THEN c = ASC(c$) - 55 ELSE c = ASC(c$) - 48
  ba1 = ba1 + c * n ^ k: k = k + 1
NEXT i: btemp = ba1: btemp$ = ""
'以上N进制转10进制(不好意思,我不会N一下子转成M,只能曲线救国)
DO
  bmd = btemp MOD m
  IF bmd < 10 THEN m$ = CHR$(bmd + 48) ELSE m$ = CHR$(bmd + 55)
  btemp = btemp \ m
  btemp$ = m$ + btemp$
LOOP UNTIL btemp = 0
'以上10转M。整数部分处理完毕。
ba2 = 0: k = 0
FOR i = 1 TO LEN(a2$)
  c$ = MID$(a2$, i, 1)
  IF c$ >= "A" AND c$ <= "Z" THEN c = ASC(c$) - 55 ELSE c = ASC(c$) - 48
  k = k + 1: ba2 = ba2 + c * n ^ (-k)
NEXT i: btemp1$ = "": bbb = ba2
'以上是小数部分自N进制转成10进制
FOR i = 1 TO x
  c = ba2 * m: cin = INT(c): ba2 = c - cin
  IF cin < 10 THEN cin$ = CHR$(cin + 48) ELSE cin$ = CHR$(cin + 55)
  btemp1$ = btemp1$ + cin$
NEXT i
'以上是小数部分自10进转成M进制(怕麻烦所以没考虑四舍五入,仅硬生生地保留了X位小数)
PRINT a$; "=";
IF btemp1$ <> "" THEN PRINT btemp$ + "." + btemp1$ ELSE PRINT btemp$
END

我来回复

您尚未登录,请登录后再回复。点此登录或注册