【问题标题】:Convert a large 2^63 decimal to binary将大的 2^63 十进制转换为二进制
【发布时间】:2011-06-14 00:16:41
【问题描述】:

我需要将一个大的十进制转换为二进制我该怎么做呢?有问题的小数是 3324679375210329505

【问题讨论】:

  • 如果您必须自己执行此操作而不是使用库函数,我最近将 a similar question 上的 stackoverflow 答案改写为 blog entry
  • 数字以 5 结尾,不会是 2^anything。
  • 嗯,我得去找几个星期前的“我为什么要学习二进制”的问题,并指出来。
  • 如果您只想转换一个数字,您可以使用古老的 UNIX / LINUX dc 工具从命令行进行。
  • @Stephen:我刚刚做到了:3324679375210329505 2 o p 给了10111000100011101000100100011011011111011110101011010110100001

标签: java binary decimal largenumber


【解决方案1】:

怎么样:

String binary = Long.toString(3324679375210329505L, 2);

【讨论】:

  • OK,但数量限制为 9223372036854775807
  • @Bohemian - 是的,但标题建议它适合 63 位(所以甚至不必担心符号)。
【解决方案2】:

你可能想去BigDecimal

BigDecimal 由任意 精度整数未缩放值和 32 位整数刻度。BigDecimal 类提供算术、刻度操作 操作、舍入、比较、散列和格式转换。 toString() 方法 提供 BigDecimal 的规范表示。

new BigDecimal("3324679375210329505").toString(2);

【讨论】:

  • @roadrunner:你的名字真棒。 :D +1
  • +1 到@Paŭlo Ebermann - 有很多替代方法可以做到这一点。
  • @Paulo:可能是 你必须 .. 来吧!这不是正当理由。如果还有其他方法,那么投票者一定对我的回答发表了评论。投票者态度恶劣。
  • 这根本行不通! BigDecimal 的 toString 没有参数。
  • @roadrunner:BigDecimal 没有采用基数的 toString 方法,BigInteger 有。这有点合乎逻辑。
【解决方案3】:

【讨论】:

  • -1 :在重新发明轮子和编写自己的代码之前,始终使用内置 API。请参阅@roadrunner 的(正确)答案。
  • @Bohemian:“总是”,即使它是一个微不足道的两行代码并且内置的解决方案效率很低?我相信你同意这有点笼统(不是我不同意):)
  • 在我写这篇文章的时候,这个问题只有一个标签:“二进制”。鉴于缺乏上下文,我选择了一般的“如何理解算法”的答案。
【解决方案4】:

我会使用堆栈!检查您的十进制数是偶数还是奇数,如果偶数将 0 推入堆栈,如果奇数将 1 推入堆栈。然后,一旦您的十进制数达到 1,您就可以从堆栈中弹出每个值并打印每个值。

这是一个非常低效的代码块供参考。您可能必须使用 long 而不是整数。

import java.util.Stack;

public class DecBinConverter {

Stack<Integer> binary;

public DecBinConverter()
{
    binary = new Stack<Integer>();
}

public int dec_Bin(int dec)
{
    if(dec == 1)
    {
        System.out.print(1);
        return 0;
    }
    if(dec == 0)
    {
        System.out.print(0);
        return 0;
    }
        if((dec%2) == 0)
        {
            binary.push(0);
            dec = dec/2;
        }
        else
        {
            binary.push(1);
            dec = dec/2;
        }   
        while(dec != 1)
        {

            if((dec%2) == 0)
            {
                binary.push(0);
                dec = dec/2;

            }
            else
            {
                binary.push(1);
                dec = dec/2;
            }   
        }
        if((dec%2) == 0)
        {
            binary.push(0);
            dec = dec/2;
        }
        else
        {
            binary.push(1);
            dec = dec/2;

        }
        int x = binary.size();
        for(int i = 0; i < x; i++)
        {
            System.out.print(binary.pop());
        }
        return 0;

}

}

【讨论】:

    【解决方案5】:

    如果您想要处理负数的速度与内置函数相同(比 Long.toString(n, 2) 快 50% 以上,比 BigInteger.toString(2) 快 150-400%),请尝试以下操作:

    static String toBinary (long n) {
        int neg = n < 0 ? 1 : 0;
        if(n < 0) n = -n;
        int pos = 0;
        boolean[] a = new boolean[64];
        do {
            a[pos++] = n % 2 == 1;
        } while ((n >>>= 1) != 0);
        char[] c = new char[pos + neg];
        if(neg > 0) c[0] = '-';
        for (int i = 0; i < pos; i++) {
            c[pos - i - 1 + neg] = a[i] ? '1' : '0';
        }
        return new String(c);
    }
    

    如果您想要long 的实际二进制恭维二进制表示(带有前导 1 或 0):

    static String toBinaryTC (long n) {
        char[] c = new char[64];
        for(int i = 63; i >= 0; i--, n >>>= 1) {
            c[i] = n % 2 != 0 ? '1' : '0';          
        }
        return new String(c);        
    }
    

    【讨论】:

      【解决方案6】:

      有点无意义,但这是C语言的解决方案:

      void to_binary(unsigned long long n)
      {
          char str[65], *ptr = str + 1;
          str[0] = '\n';
          do{
              *ptr++ = '0' + (n&1);
          } while(n >>= 1);
          while(ptr > str)
              putc(*--ptr, stdout);
      }
      

      例如,它打印出来:

          10111000100011101000100100011011011111011110101011010110100001
      

      编辑:如果你不介意前导零......

      void to_binary(unsigned long long n)
      {
          do{ putc('0' + (n>>63), stdout); } while(n <<= 1);
      }
      

      【讨论】:

      • 现在添加十进制转换:-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 2013-05-28
      • 2013-01-24
      • 2016-08-28
      相关资源
      最近更新 更多