2012-04-04 6 views
0

범위의 모든 정수를 이진 문자열로 파일에 저장하는 알고리즘을 코딩하려고합니다. 예를 들어, 0에서 7까지의 범위 :C++ 정수를 bool의 배열로 변환하는 알고리즘

0 0 0 
0 0 1 
0 1 0 
0 1 1 
1 0 0 
1 0 1 
1 1 0 
1 1 1 

숫자 사이의 앞에 오는 0과 공백은 필수적입니다.

간단한 방법으로 수행 할 수없는 작업은 정수를 bool [] (또는 다른 대체 방법)으로 표시된 이진수로 변환하는 것입니다.

편집이 요청으로

, 내 솔루션은 지금까지입니다 : 불행하게도

const int NUM_INPUTS = 6; 
bool digits[NUM_INPUTS] = {0}; 
int NUM_PATTERNS = pow(2, NUM_INPUTS); 

for(int q = 0; q < NUM_PATTERNS; q++) 
{ 
    for(int w = NUM_INPUTS -1 ; w > -1 ; w--) 
    { 

     if(! ((q+1) % ((int) pow(2, w))) ) 
      digits[w] = !digits[w]; 

     outf << digits[w] << " "; 
    } 

    outf << "\n"; 
} 

이가 나에게주는 첫 번째 패턴으로 조금 터져이다 000001 대신 000000

입니다

이것은 숙제가 아닙니다. 나는 신경 네트워크를 훈련시키기위한 입력 파일을 제공하는 간단한 알고리즘을 코딩하고있다.

+0

이 숙제인가 ? 그렇다면 그 태그를 – Shahbaz

+0

으로 바꾸십시오. 대신 기본 변환을하고 싶다고 생각합니다. Google ** C++ base 2 ** – Blender

+0

바이너리 데이터는 bool 배열과 다릅니다 ...자신 만의 이진 표현을 만들어야합니까? – Kiril

답변

4

pow를 사용하지 마십시오 다음과 같이

따라서, 코드는 것이다. 이진 수학을 사용하십시오 :

const int NUM_INPUTS = 6; 
int NUM_PATTERNS = 1 << NUM_INPUTS; 

for(int q = 0; q < NUM_PATTERNS; q++) 
{ 
    for(int w = NUM_INPUTS -1 ; w > -1; w--) 
    { 
     outf << ((q>>w) & 1) << " "; 
    } 
    outf << "\n"; 
} 
+0

'1 << 6 "= 64는 어떻게됩니까? 나는 '<<' or '>>'연산자에 익숙하지 않다. –

+0

'x << n'은'x' 값을'n' 비트만큼 왼쪽으로 이동시킵니다. 원한다면,'x','n' 번 값을 두 배로 늘립니다. 1은 2 진수로 "0000_0001"입니다. 1 왼쪽으로 6 번 이동하면 "0100_0000"이됩니다. 10 진수는 64입니다. 비슷하게'x >> n'은'x' 값을'n' 비트 (또는'x','n' 번)만큼 * right *로 이동시킵니다. http://en.wikipedia.org/wiki/Bitwise_operation#Bit_shifts –

3

참고 : 나는 코드를 제공 아니지만, 단지 힌트 질문 숙제

이 매우 쉽습니다

같은 소리 때문이다. 또는 서면

number = 23 
binary representation = 10111 
first digit = (number )&1 = 1 
second digit = (number>>1)&1 = 1 
third digit = (number>>2)&1 = 1 
fourth digit = (number>>3)&1 = 1 
fifth digit = (number>>4)&1 = 1 

:이 알고리즘에 의해 촬영 숫자의 순서가 인쇄 할 무엇의 반대입니다

temp = number 
for i from 0 to digits_count 
    digit i = temp&1 
    temp >>= 1 

참고이 예제를 참조하십시오.

+0

int compare = 1L << (digits_count - 1); digit i = (temp & compare? 1 : 0); 임시 << 1; –

+0

당신이 궁금해하는 경우에, 그것은 당신이 원하는 순서대로 숫자를 가져 가게 할 것입니다. –

+0

@OrgnlDave, 나는 궁금하지 않았습니다. 나는 OP에게 힌트를 줄 의도 만하고, 문제를 직접 해결할 것입니다. – Shahbaz

-1

이 컨텍스트에서 문제는 10 진수를 2 진수로 변환하는 것과 같습니다. 솔루션으로 기본 산술 방법을 적용 할 수도 있습니다. 그리고 그 방법을 구현하기 시작한 것은 입니다.

그러나이 방법은 mod (%) 연산을 사용하여 구현할 수 없습니다. 또한 부서 (/) 작업을 사용해야합니다.

int s = q; 

    for(int w = NUM_INPUTS -1 ; w > -1 ; w--) 
    { 
     (s/pow(2,w)) ? digits[w] = 1 : digits[w] = 0; 
     s %= pow(2,w); 

     outf << digits[w] << " "; 
    } 
+0

내가 downvote에 대한 이유를 물어 봐도 될까요? – oak

+0

불필요한 산술을 과도하게 사용합니다. 몇 비트 쉬프트 및 비교가있는 루프가 훨씬 쉽고 적절하며 명확 해졌습니다. –

+0

다른 방법의 용이함에 동의합니다. 그러나 저수준 비트 연산을 방해하지 않고이 문제에 접근하려고했습니다. 또한이 방법은이 산술적 방법을 구현하려고합니다. – oak

1

게으른 방법은 std :: bitset을 사용하는 것입니다.

예 : 출력하고자하는 경우

#include <bitset> 
#include <iostream> 

int main() 
{ 
    for (unsigned int i = 0; i != 8; ++i){ 
    std::bitset<3> b(i); 
    std::cout << b << std::endl; 
    } 
} 

이 비트가 개별적으로, 공간 분리가, Write로, Write(b) 같은를 호출 std::cout << b << std::endl; 교체로 정의 :

template<std::size_t S> 
void Write(const std::bitset<S>& B) 
{ 
    for (int i = S - 1; i >= 0; --i){ 
    std::cout << std::noboolalpha << B[i] << " "; 
    } 
    std::cout << std::endl; 
} 
+0

std :: bitset이란 무엇입니까? –

+0

@MattMunson : 이제 실제 화면과 실제 키보드가있는 실제 컴퓨터에 액세스 할 수있게되었으므로 예제를 추가했습니다. –

관련 문제