2014-03-25 58 views
-1

我想将数字从十六进制(基地16)转换为三元(基地3),
一个简单的解决方案是转换每个数字像这样hex-> decimal-> binary-> ternary ,
是否有更高效的(=意味着更少的代码)这个问题?汇编转换从十六进制到基数3

+0

Hex-> binary非常简单(除非你的十六进制值是一个字符串,否则它是非运算的,但即使这样也很简单)。所以做hex-> binary-> ternary。 –

+0

@PaulR它是一个字符串,你能解释一下这个过程吗? – user3453625

+0

每个十六进制字符直接映射到4个二进制位。 0 - > 0000,1-> 0001,...,9 - > 1001,A - > 1010,...,F - > 1111.所以如果你的字符串是137f,那么这就变成0001 0011 0111 1111.也许这样做首先在HLL(例如C)中获取逻辑权限,然后将其转换为asm? –

回答

1

取决于“二元”是什么意思。如果你的意思是--CPU的内部表示,那肯定是要走的路。在任何数字系统中将数字转换为字符串涉及整数算术,并且用数字的字符串表示来做这件事很麻烦。

如果你的意思是 - 二进制字符串,一个字符串“0”和“1”字符,你不会错。

总之,正确的算法将涉及:

  • 转换数量从十六进制字符串转换为整数(如果它是一个编译时间常数 - 则汇编)
  • 除以三说整一个循环,直到你达到零
  • 存储各部门的剩余部分 - 这是你的三元位数
  • 转换三元位数ASCII
  • 输出
1

为了在底m的数转换成一个数在n进制:

  • 转换原始基础m个成整数。这很简单(主要是“value = value + digit * base”循环)。
  • 将该整数转换为基数n。这很简单(主要是“数字=值%基础;价值=价值/基地”循环)。

对于某些情况(例如,在十六进制和整数之间转换),通过使用位移和掩码代替乘法,除法和模数来优化计算是很容易的。