将十进制数字数组转换为二进制数字数组

时间:2009-11-01 12:10:36

标签: pseudocode

这可能是一个非常奇特的问题。

我的问题如下:

TI 83+图形计算器允许您使用汇编和连接电缆或其内置TI-BASIC编程语言对其进行编程。

根据我发现,它只支持16位整数和一些模拟浮点数。

我想使用更大的数字(大约64位),所以我使用一个数字的数组:

{1, 2, 3, 4, 5}

将是Decimal 12345。

二进制,即110000 00111001,或二进制数字数组:

{1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1}

这将是计算器显示它的方式。

我如何将这个十进制数字数组(对于计算器来说太大而无法将其显示为本机类型)转换为十进制数字数组?

效率不是问题。这不是作业。

这样我就可以自由地为这样的数组实现Addition。

谢谢!

3 个答案:

答案 0 :(得分:1)

考虑一下,我想我会用以下'算法'

来做
  • 检查最后一位数字(示例中为5)
  • 如果是奇数,则存储(从相反的顺序)二进制数组中的1

  • 现在通过以下方法将数字除以2:

  • 从第一个数字开始并清除'进位'变量。
  • 除以2并添加'进位'变量。如果剩余部分为1(在使用和& 1进行除法之前检查这一点),则将5放入进位
  • 重复,直到所有数字都已完成

再次重复这两个步骤,直到整数减少到0。

二进制数组中的数字是二进制表示

你的例子: 1,2,3,4,5

  • 5是奇数,所以我们在二进制数组中存储1:1
  • 我们使用算法将数组除以2:
  • 0,2,3,4,5 => 0,1 + 5,3,4,5 => 0,6,1,4,5 => 0,6,1,2 + 5,5 => 0,6,1,7,2

并重复:

0,6,1,7,2最后一位是偶数所以我们存储0:0,1(注意我们从右到左填充二进制字符串)

你最终得到一个二进制文件

编辑: 只是为了澄清以上内容:我所做的只是古老的算法:

 int value=12345;
 while(value>0)
 {
      binaryArray.push(value&1);
      value>>=1;     //divide by 2
 }

除了在你的例子中我们没有int但是一个表示(10 base)int的数组; ^)

答案 1 :(得分:0)

这里的主要问题是你在不是彼此的倍数的基数之间进行,因此输入数字和输出数字之间没有直接的孤立映射。您可能必须从最低有效数字开始,在需要查询下一个数字之前输出尽可能多的输出最低有效数字,依此类推。这样,您只需要在任何给定的时间点检查最多2个输入数字。

您可能会发现在处理顺序方面有利于以反向形式存储您的数字(这样最低有效数字在数组中排在第一位)。

答案 2 :(得分:0)

在途中将十进制表示中的每个数字转换为它的二进制表示,然后添加所有数字的二进制表示:

5 = 101
40 = 101000
300 = 100101100
2000 = 11111010000
10000 = 10011100010000

             101
          101000
       100101100
     11111010000
+ 10011100010000
----------------
  11000000111001

C#中的概念证明:

转换为二进制数字数组,添加数组并将数组乘以10的方法:

private static byte[] GetBinary(int value) {
  int bit = 1, len = 1;
  while (bit * 2 < value) {
    bit <<= 1;
    len++;
  }
  byte[] result = new byte[len];
  for (int i = 0; value > 0;i++ ) {
    if (value >= bit) {
      value -= bit;
      result[i] = 1;
    }
    bit >>= 1;
  }
  return result;
}

private static byte[] Add(byte[] a, byte[] b) {
  byte[] result = new byte[Math.Max(a.Length, b.Length) + 1];
  int carry = 0;
  for (int i = 1; i <= result.Length; i++) {
    if (i <= a.Length) carry += a[a.Length - i];
    if (i <= b.Length) carry += b[b.Length - i];
    result[result.Length - i] = (byte)(carry & 1);
    carry >>= 1;
  }
  if (result[0] == 0) {
    byte[] shorter = new byte[result.Length - 1];
    Array.Copy(result, 1, shorter, 0, shorter.Length);
    result = shorter;
  }
  return result;
}

private static byte[] Mul2(byte[] a, int exp) {
  byte[] result = new byte[a.Length + exp];
  Array.Copy(a, result, a.Length);
  return result;
}

private static byte[] Mul10(byte[] a, int exp) {
  for (int i = 0; i < exp; i++) {
    a = Add(Mul2(a, 3), Mul2(a, 1));
  }
  return a;
}

转换数组:

byte[] digits = { 1, 2, 3, 4, 5 };

byte[][] bin = new byte[digits.Length][];
int exp = 0;
for (int i = digits.Length - 1; i >= 0; i--) {
  bin[i] = Mul10(GetBinary(digits[i]), exp);
  exp++;
}
byte[] result = null;
foreach (byte[] digit in bin) {
  result = result == null ? digit: Add(result, digit);
}

// output array
Console.WriteLine(
  result.Aggregate(
    new StringBuilder(),
    (s, n) => s.Append(s.Length == 0 ? "" : ",").Append(n)
  ).ToString()
);

输出:

1,1,0,0,0,0,0,0,1,1,1,0,0,1

编辑:
添加了将数组乘以十进制的方法。在将数字转换为二进制数组之前将数字相乘的Intead必须对数组进行处理。