2012-11-04 4 views
3

Мне нужно реализовать функцию, которая разлагает значение на две пары с помощью java.разложение значения на два значения

например: 14 = 8 + 4 + 2

мне нужно найти силы двух, которые получает разложенные значение. Для вышеприведенного примера мне нужно 2,3,1 в качестве выходов. Как я мог это реализовать?

+0

Вы знакомы с логарифмами? – user1118321

+0

Да. Я думаю, что я – Assasins

+0

@ user1118321 - логарифмы - неправильный инструмент для этого. –

ответ

2

Для этого обычно используют побитовые операции, а именно сдвиг (< <, >>, >>>) и побитовый и (&) оператор , потому что внутреннее представление целых чисел в компьютерах уже двоично, что вам и нужно.

В двоичном представлении каждое целое значение представляет собой композицию из степеней 2: 1, 2, 4, 8, 16, 32, ...

Итак, 14 в десятичной системе в двоичное 1110: 8 + 4 + 2 + 0.

Если вы после некоторого хорошего, общего алгоритма, вы можете начать разлагать десятичные числа в свои полномочия 10 и оттуда расширить решение других оснований, как 2.

8

Воспользуйтесь бинарным представлением, которое использует Java. Я не знаю, какую форму вы хотите использовать для 2-х степеней, но вы можете циклически перебирать биты по одному, перемещаясь и побитно & с 1, чтобы протестировать каждый бит. Каждый 1 бит представляет собой сумму 2 в сумме.

Например:

List<Integer> powers = new ArrayList<Integer>(); 
n = . . .; // something > 0 
int power = 0; 
while (n != 0) { 
    if ((n & 1) != 0) { 
     powers.add(1 << power); 
     // or, if you just need the exponents: 
     // powers.add(power); 
    } 
    ++power; 
    n >>>= 1; 
} 
+0

Все компьютеры и почти все языки поддерживают двоичное представление. ;) –

+0

@PeterLawrey - В значительной степени, но это вопрос Java конкретно. –

+0

В этом случае я бы использовал специальную коллекцию Java для набора бит. ;) –

7

Как целые числа уже представлены в виде степени двойки и Java имеет коллекции для набора битов, я использовал бы эти два.

public static void main(String[] args) { 
    System.out.println(bitsSet(14)); 
} 

public static BitSet bitsSet(long num) { 
    BitSet bitSet = new BitSet(); 
    for (int i = 0; i < 64; i++) 
     if (((num >>> i) & 1) != 0) 
      bitSet.set(i); 
    return bitSet; 
} 

печатают

{1, 2, 3} 
1

Вы можете просто вычесть 2 из значения и продолжать вычитать последующие более высокие мощности.

int x = 0; 
int value = args[0]; 
for (i=0, (value - Math.pow(2, i)) >= 0, i++) { 
    value = value - Math.pow(2, i); 
    x++; 
} 
for (i=0, i<x, i++) { 
    System.out.println("addent: " + Math.pow(2, i); 
} 
Смежные вопросы