2의 거듭 제곱의 결과로 값을 형성하는 정수를 얻을 수 있습니까?2의 거듭 제곱의 결과로 값 분해
Example:
129 resolves [1, 128]
77 resolves [1, 4, 8, 64]
이미 Math.log를 사용하고 비트 비교를 사용하여 foreach를 수행하는 것에 대해 생각했습니다. 다른 더 아름다운 해결책이 있습니까?
2의 거듭 제곱의 결과로 값을 형성하는 정수를 얻을 수 있습니까?2의 거듭 제곱의 결과로 값 분해
Example:
129 resolves [1, 128]
77 resolves [1, 4, 8, 64]
이미 Math.log를 사용하고 비트 비교를 사용하여 foreach를 수행하는 것에 대해 생각했습니다. 다른 더 아름다운 해결책이 있습니까?
가장 쉬운 방법은 1부터 시작하여 값이 검사 할 값보다 커질 때까지 1부터 시작하여 비트 '왼쪽'으로 이동하여 각 비트 단계를 비트와 비트 값을 비교하는 것입니다. 설정된 비트는 배열에 저장할 수 있습니다. 비트 시프트하는 것은 2의 거듭 제곱으로 볼 수
function GetBits(value){
var b = 1;
var res= [];
while(b<=value){
if(b & value)res.push(b);
b <<= 1;
}
return res;
}
때문에, 결과는 어레이에 직접 전류 비트 값을 푸시 할 수있다.
에 올 때
연속적으로 빼는 알고리즘 숫자가 0이 될 때까지 방금 만든 그룹의 번호보다 큰 숫자 또는 가장 큰 숫자입니다.
77-64 = 13 ==> [64]
13-8 = 7 ==> [8]
7-4 = 3 ==> [4]
3 -2 = 1 ==은> [2]
= 0 ==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);
function getBits(val, factor) {
factor = factor || 1;
if(val) {
return (val % 2 ? [factor] : []).concat(getBits(val>>1, factor*2))
}
return [];
}
alert(getBits(77));
https://www.youtube.com/watch를? v = Oca32pZmKzM –