2017-10-20 3 views
-1

정수로 입력을 받아들이고 2의 제곱 인 정수 목록을 반환하는 aC# 메소드를 작성하려고합니다. 그 합계는 입력 정수 예를 들어정수를 출력 정수 합계와 같은 비트 수로 변환 한 후 개별 제곱수를 계산합니다.

Input Integer :15 
Output of this should be 1(2^0), 2 (2^1), 4 (2^2), 8 (2^3) 
Sum of above integers is 15 = Input Integer 


Input Integer :13 
Output of this should be 1(2^0), 4 (2^2), 8 (2^3) 
Sum of above integers is 13 = Input Integer 


Input Integer :8 
Output of this should be: 8 (2^3) 
Sum of above integers is 15 = Input Integer 

내가이 작업을 수행 할 수있는 좋은 방법을 알 수있을 것 같다?

+0

을 통해 답변을 있어요? 가능한 모든 32 비트 (힌트 : 루프)에 대해 그렇게하면 대답을 얻을 수 있습니다. 시도해 보시고 문제가 생기면 코드를 보여주고 특정 문제에 대해 물어보십시오. – oerkelens

+1

'BitArray'에게 [Chance] (https://stackoverflow.com/questions/6758196/convert-int-to-a-bit-array-in-net)를 제공하고 필요한대로 출력 형식을 지정하십시오. – lokusking

+0

제발, (안) 작동 코드. [질문하는 방법] (https://stackoverflow.com/help/how-to-ask) –

답변

0

은 어떻게 당신이 당신의 입력 정수의 n`이 1 인`비트 있는지 확인 할 코멘트

  var bits = new BitArray(BitConverter.GetBytes(12)); 
            List<Double> restrictedList = new List<Double>(); 
            for(int i=0;i<bits.Count;i++) 
            { 
                if (bits[i]==true) 
                { 
                    restrictedList.Add(Math.Pow(2, i)); 
                } 
            } 
0

숫자의 이진 표현은 말 그대로 그 수의 합이 2 인 2의 제곱근 비트 맵입니다. LSB에서 MSB로 비트 단위로 반복하여 각 비트에 적절한 문자열을 1로 설정합니다.

0

일반적으로 숫자의 이진 표현이 필요합니다. 출력은 표현에 1이있는 위치 목록 (뒤로 계산)입니다.

일반적으로이를 구현하는 방법은 일반적으로 나누기의 모듈러스를 2로 확인한 다음 루프에서 2로 나누는 것입니다.

+0

이 접근법은 일반화 된 기본 변환에 적용됩니다. 바이너리의 경우 비트 연산자를 사용하는 것이 훨씬 빠릅니다. –

+0

하지만 이것은 비트 연산이하는 것입니다. 아마 모든 최신 컴파일러는 2로 나누기를 최적화하고 어쨌든 2를 모듈로 각각의 비트 연산에 최적화 할 것입니다. 대개의 경우 최적화 된 특정 솔루션을 제공 할 필요가 없으므로 더 이상 더 이상 빠르지 않습니다. –

+0

불행히도 2로 나누기 및 2로 나누기는 비트 연산과 동일하지 않습니다. 좋은 컴파일러는 대체가 허용되는지 여부를 증명하려고 시도하지만 그 증명이 성공하는지 여부는 언어 규칙에 의해 크게 영향을받습니다. 비트를보고 싶다면 비트 연산을 작성하십시오. –