2014-12-21 5 views
-1

소녀는 보드에 홀수와 짝수로 N 개의 숫자를 쓴 다음 짝수를 수정하고 이진 표현을 왼쪽에서 오른쪽으로 반전하고 각각을 우수. 같은 코드를 작성하십시오.C에서 짝수의 비트 반전

  int a[100000]; 
      while (t != 0) // t is the number in which input is taken 
      { 
       k = t & 1; 
       if (k == 1)    
       a[i] = 0; // a is the array in which bits of new number will be stored 
       else 
       a[i] = 1; 
       i++; 
       t = t >> 1; 
      } 
      for (j = i; j >= 0; j--) 
      { 
       if (a[j] == 1) 
       { 
        num = num + pow(2,j)*a[j]; // num is the number to be formed 
       } 
      } 
       cout<<num<<"\n"; 

하지만 내 대답은 8 예를 들어, 일부 값에 대한 잘못된 나옵니다, 그것은 7 출력 :

0 <= n <= 10^7 

나는 내 일부 코드는 다음과 같습니다 곳,에 대한 코드를했다. 이게 뭐가 잘못 되었 니? 감사!

해결 링크 :

http://www.spoj.com/problems/EC_CONB/

편집 :

  while (t != 0) 
      { 
       k = t & 1; 
       if (k == 1)    
       a[i] = 0; 
       else 
       { 
        a[i] = 1; 
        num = num + pow(2,i); 
       } 
       i++; 
       t = t >> 1; 
      } 
      cout<<num<<"\n"; 
     } 

이 여전히 동일한 문제를 도시 7.

+2

(8) 1000 그렇게 7 즉 당신이 0111 기대했던 어떤 가치 정확한지? – parkydr

+0

비트를 반전시키기 위해'~'연산자를 사용하는 대신에 이런 식으로하는 특별한 이유가 있습니까? – ClickRick

+0

죄송하지만, 여기 제가 해결하려고하는 문제의 링크가 있습니다. http://www.spoj.com/problems/EC_CONB/. 여기, 샘플 사례는 다른 것입니다. –

답변

0

이 문제는 실제로 반전되지 않는 비트를 반전 시키길 원합니다. 따라서 if k == 1을 점검하고 대신 0을 넣는 부분은 비트를 반전시키기 때문에 올바르지 않습니다.

while (t != 0) 
{ 
    k = t & 1; 
    // push the output array to the left 
    num <<= 1; 
    // add the read bit to the beginning of the output array 
    num += k; 
    t = t >> 1; 
} 

설명 :

기본적인 아이디어는

1000 (8) -> 0001 (1) 
1010 (10) -> 0101 (5) 

샘플 코드 코드를 기반으로 : 당신이해야 할 일은

는 다음과 같이 비트의 순서를 역입니다 입력 번호에서 비트를 하나씩 읽은 다음 출력 번호의 시작 부분으로 푸시합니다. 다음은

각 반복에서 번호 (1011) 반전의 흔적입니다 :

iterations 0  1  2  3 4 
input   1011 101 10 1 0 
output  0  1  11 110 1101 
+0

이것은 아주 좋습니다. 고마워. 그러나, 위의 코드에 몇 가지 설명을 추가해 주시겠습니까? 비트 연산자를 처음 사용하고 제대로 이해하지 못하는 것 같습니다. 그렇게한다면 그것은 나에게 큰 도움이 될 것입니다. 감사. :) –

+0

코드 끝에 몇 가지 주석과 설명을 추가했습니다. –

+0

고마워요. 너는 위대하다. :) –

0
등 (8)의 값을 출력한다 (피트, 응답에 응답하여)

i을 증가시킨 후 a[i]을 읽는 것으로 보이므로 동작은 정의되지 않습니다.

배열을 만드는 대신 결과를 첫 번째 루프에 축적하십시오.

+0

내 대답을 업데이트하고 새 코드를 작성했지만 여전히 동일한 문제가 있습니다. –

+0

@ JohnYad 원본에 1이 있거나 0이있는 곳에 코드에 1을 추가합니까? 그것은 비트를 뒤집거나 반전시키고 있습니까? –

+0

내 코드는 1이있는 경우 0이 있고 0이면 0을 추가합니다. 그리고 비트를 반전하고 반전하지 않습니다. –

0

어레이? 루프? 필요 없습니다.

같은 숫자가 완전히 같이, 마우스 오른쪽 정당화 다음 정수 반전과 동등 역전

// reverse from http://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel 
// swap odd and even bits 
v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1); 
// swap consecutive pairs 
v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2); 
// swap nibbles ... 
v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4); 
// swap bytes 
v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8); 
// swap 2-byte long pairs 
v = (v >> 16   ) | (v    << 16); 
// right-justify 
v /= v & -v; 

vuint32_t되어야 (시험되지 않음).