2015-02-03 1 views
0

2의 거듭 제곱의 결과로 값을 형성하는 정수를 얻을 수 있습니까?2의 거듭 제곱의 결과로 값 분해

Example: 
129 resolves [1, 128] 
77 resolves [1, 4, 8, 64] 

이미 Math.log를 사용하고 비트 비교를 사용하여 foreach를 수행하는 것에 대해 생각했습니다. 다른 더 아름다운 해결책이 있습니까?

답변

1

가장 쉬운 방법은 1부터 시작하여 값이 검사 할 값보다 커질 때까지 1부터 시작하여 비트 '왼쪽'으로 이동하여 각 비트 단계를 비트와 비트 값을 비교하는 것입니다. 설정된 비트는 배열에 저장할 수 있습니다. 비트 시프트하는 것은 2의 거듭 제곱으로 볼 수

function GetBits(value){ 
    var b = 1; 
    var res= []; 
    while(b<=value){ 
    if(b & value)res.push(b); 
    b <<= 1; 
    } 
    return res; 
} 

Example

때문에, 결과는 어레이에 직접 전류 비트 값을 푸시 할 수있다.

+0

https://www.youtube.com/watch를? v = Oca32pZmKzM –

0
  1. 숫자에 포함 된 2의 가장 큰 제곱수를 찾습니다.
  2. 원래 번호에서 뺀 다음 목록에 추가하십시오.
  3. 지수를 감소시키고 새로운 2의 힘이 숫자보다 작은 지 확인하십시오.
  4. 더 적은 수의 경우 원래 수에서 빼고 목록에 추가하십시오. 전화 번호는 내가이 개 번호 < = 전화 번호의 모든 전원의 목록을 만드는 생각하고 0
0

에 올 때

  • 그렇지 않으면 3
  • 종료 단계로 이동, 다음 더하기 - 빼기를 사용 알고리즘을 사용하여 올바른 숫자 그룹을 찾습니다. 숫자 77 : 요소 그룹은 {1,2,4,8,16,32,64}입니다 [64는 2보다 큰 77의 동그라미입니다]

    연속적으로 빼는 알고리즘 숫자가 0이 될 때까지 방금 만든 그룹의 번호보다 큰 숫자 또는 가장 큰 숫자입니다.

    77-64 = 13 ==> [64]

    13-8 = 7 ==> [8]

    7-4 = 3 ==> [4]

    3 -2 = 1 ==은> [2]

    = 0 ==

    1-1> [1]

    당신이 내 알고리즘을 이해 희망, 내 나쁜 영어를 파르.

  • 1

    다른 언어의 솔루션을 javascript에 적용 할 수 있습니다. 이 질문에서 Java를 사용하여 문제를 해결할 수있는 몇 가지 방법을 찾을 수 있습니다 (더 우아하게 찾을 수 있습니다).

    decomposing a value into powers of two

    나는 자바 스크립트에 그 해답 중 하나를 채택하고이 코드를 가지고 올 :

    var powers = [], power = 0, n = 129;// Gives [1,128] as output. 
    while (n != 0) { 
        if ((n & 1) != 0) { 
         powers.push(1 << power); 
        } 
        ++power; 
        n >>>= 1; 
    } 
    console.log(powers); 
    

    Fiddle

    0
    function getBits(val, factor) { 
        factor = factor || 1; 
        if(val) { 
         return (val % 2 ? [factor] : []).concat(getBits(val>>1, factor*2)) 
        } 
        return []; 
    } 
    
    alert(getBits(77)); 
    
    관련 문제