Преобразовать большое 2 ^ 63 десятичное в двоичную - PullRequest
2 голосов
/ 14 июня 2011

Мне нужно преобразовать большое десятичное число в двоичное, как мне поступить? Десятичный знак в вопросе это 3324679375210329505

Ответы [ 6 ]

5 голосов
/ 14 июня 2011

Как насчет:

String binary = Long.toString(3324679375210329505L, 2);
5 голосов
/ 14 июня 2011

Вы можете перейти на BigDecimal.

BigDecimal состоит из целочисленного немасштабированного значения произвольной точности и 32-разрядной целочисленной шкалы. Класс BigDecimal предоставляет операции для арифметики, манипуляции с масштабом, округления, сравнения, хеширования и преобразования формата.Метод toString () обеспечивает каноническое представление BigDecimal.

new BigDecimal("3324679375210329505").toString(2);
1 голос
/ 14 июня 2011
0 голосов
/ 14 июня 2011

Я бы использовал стек! Проверьте, является ли ваше десятичное число четным или нечетным, если четное число 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;

}

}
0 голосов
/ 14 июня 2011

Если вам нужно что-то быстрое (более чем на 50% быстрее, чем Long.toString(n, 2) и на 150-400% быстрее, чем BigInteger.toString(2)), которое обрабатывает отрицательные числа так же, как встроенные, попробуйте следующее:

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);
}

Если вы хотите, чтобы фактическое двоичное представление Compliment для двоих 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);        
}
0 голосов
/ 14 июня 2011

Немного бессмысленно, но вот решение в 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);
}
...