2013-04-16 3 views
1

나는 막혔다. 나는 몇 시간 동안 내 코드를보고 있었고 무엇이 잘못 됐는지 알 수 없었다. 내 함수는 음수 또는 양수 중 하나를 받아 32 비트 2의 보수 16 진수 표현으로 변환합니다. 내 함수는 문자 배열 (32 비트 부호가있는 크기 표현)을 사용하고 배열의 2의 보수를 취합니다. 그것을 2의 보수로 변환하는 나의 접근법은 특정 문자가 보일 때 단순히 배열에 문자를 할당하는 것입니다. 특수 문자는 배열에 표시된 문자가 첫 번째 문자 인 경우 발생합니다. 나머지는 일반적으로 무효화됩니다. 나는 현재 붙어있다. -23 (부호가있는 크기는 80000017 임) 값을 입력하면 K00000KK 값을 얻습니다. -23452 (부호 량 80005B9C) -> K000KKKK. 나는 값이 'K'가되도록 설정하여 코드가 멈춰있는 곳을 찾았습니다. 원래 값은 '7'이었습니다. 코드에서, 나는 컴파일러가 어디로 가는지 볼 디스플레이 메시지를 넣어C의 2의 보수 코드

for -23 (80000017) input I get the messages 

first 1 is seen, leave first 1 the same 
first 1 is seen, leave first 1 the same 
no one's showed up yet --> 0 
no one's showed up yet --> 0 
no one's showed up yet --> 0 
no one's showed up yet --> 0 
no one's showed up yet --> 0 
first 1 is seen, leave first 1 the same 

거의 내가 처음 한 메시지가 어디 0 내가 얻을 표시되는 경우 표시됩니다 K가 어디 -> 0 메시지를

도움 주셔서 감사합니다. 매우 감사! 여기

http://pastebin.com/KSeymwcs

char* two_complement(int number, char* sign_mag_array){ 

int first_one_flag = 0; 

if(number > 0){ 
    cout << "positive number" << endl; 
    return sign_mag_array; 
} 

if(number < 0){ 
    for(int q = 7; q >= 0; q--){ 
     if(first_one_flag == 1){    // negate the rest regularly 
      cout << "negate normally " << endl; 

      if(sign_mag_array[q] == '0'){ 
       sign_mag_array[q] = 'F'; 
      } 
      if(sign_mag_array[q] == '1'){ 
       sign_mag_array[q] = 'E'; 
      } 
      if(sign_mag_array[q] == '2'){ 
       sign_mag_array[q] = 'D'; 
      } 
      if(sign_mag_array[q] == '3'){ 
       sign_mag_array[q] = 'C'; 
      } 
      if(sign_mag_array[q] == '4'){ 
       sign_mag_array[q] = 'D'; 
      } 
      if(sign_mag_array[q] == '5'){ 
       sign_mag_array[q] = 'A'; 
      } 
      if(sign_mag_array[q] = '6'){ 
       sign_mag_array[q] = '9'; 
      } 
      if(sign_mag_array[q] == '7'){ 
       sign_mag_array[q] = '8'; 
      } 
      if(sign_mag_array[q] == '8'){ 
       sign_mag_array[q] = '7'; 
      } 
      if(sign_mag_array[q] = '9'){ 
       sign_mag_array[q] = '6'; 
      } 
      if(sign_mag_array[q] == 'A'){ 
       sign_mag_array[q] = '5'; 
      } 
      if(sign_mag_array[q] == 'B'){ 
       sign_mag_array[q] = '4'; 
      } 
      if(sign_mag_array[q] = 'C'){ 
       sign_mag_array[q] = '3'; 
      } 
      if(sign_mag_array[q] == 'D'){ 
       sign_mag_array[q] = '2'; 
      } 
      if(sign_mag_array[q] == 'E'){ 
       sign_mag_array[q] = '1'; 
      } 
      if(sign_mag_array[q] == 'F'){ 
       sign_mag_array[q] = '0'; 
      } 
     } 


     if(sign_mag_array[q] == '0' && first_one_flag == 0){ 
      cout << "no one's showed up yet --> 0 " << endl; 
     } 
     else{            // first '1' in binary seen. special negating 
      //first_one_flag = 1;    
      cout << "first 1 is seen, leave first 1 the same " << endl; 

      if(sign_mag_array[q] == '1'){ 
       sign_mag_array[q] = 'F';   
      } 
      if(sign_mag_array[q] == '2'){ 
       sign_mag_array[q] = 'E'; 
      } 
      if(sign_mag_array[q] == '3'){ 
       sign_mag_array[q] = 'D'; 
      } 
      if(sign_mag_array[q] == '4'){ 
       sign_mag_array[q] = 'C'; 
      } 
      if(sign_mag_array[q] == '5'){ 
       sign_mag_array[q] = 'B'; 
      } 
      if(sign_mag_array[q] == '6'){ 
       sign_mag_array[q] = 'A'; 
      } 
      if(sign_mag_array[q] = '7'){ 
       sign_mag_array[q] = '9'; 
      } 
      if(sign_mag_array[q] == '8'){ 
       sign_mag_array[q] = '8'; 
      } 
      if(sign_mag_array[q] == '9'){ 
       sign_mag_array[q] = 'K'; 
      }  
      if(sign_mag_array[q] == 'A'){ 
       sign_mag_array[q] = '6'; 
      } 
      if(sign_mag_array[q] == 'B'){ 
       sign_mag_array[q] = '5'; 
      } 
      if(sign_mag_array[q] == 'C'){ 
       sign_mag_array[q] = '4'; 
      } 
      if(sign_mag_array[q] == 'D'){ 
       sign_mag_array[q] = '3'; 
      } 
      if(sign_mag_array[q] == 'E'){ 
       sign_mag_array[q] = '2'; 
      } 
      if(sign_mag_array[q] == 'F'){ 
       sign_mag_array[q] = '1'; 
      } 
     } 
    }  
} 
return sign_mag_array; 

}

+4

는 컴파일러에서 경고를 활성화

당신은 독점 조건을 원한다. – Lundin

답변

4

이 오류는 간단합니다 ... 코드의 서식이 나를 짜증 때문에 내 코드에 페이스트 빈 링크입니다

 if(sign_mag_array[q] = '7'){ 
      sign_mag_array[q] = '9'; 
     } 

이어야합니다. 363,210
 if(sign_mag_array[q] == '7'){ 
      sign_mag_array[q] = '9'; 
     } 

 if(sign_mag_array[q] = 'C'){ 
      sign_mag_array[q] = '3'; 
     } 

 if(sign_mag_array[q] == 'C'){ 
      sign_mag_array[q] = '3'; 
     } 

 if(sign_mag_array[q] = '9'){ 
      sign_mag_array[q] = '6'; 
     } 

이어야되어야

 if(sign_mag_array[q] == '9'){ 
      sign_mag_array[q] = '6'; 
     } 

등등. 당신이 아이디어를 얻은 것 같아요.

코드를 많이 반복하면이 스타일이 좋지 않으므로 쉽게 만들 수 있습니다. 약간의 수학으로이 코드를 크게 단순화하고 단축 할 수 있어야합니다.

예를 들어 정수를 16 진수로 변환하는 두 가지 기능을 추가하고이

 if(sign_mag_array[q] == '0'){ 
      sign_mag_array[q] = 'F'; 
     } 
     if(sign_mag_array[q] == '1'){ 
      sign_mag_array[q] = 'E'; 
     } 
     ... 
     if(sign_mag_array[q] == 'E'){ 
      sign_mag_array[q] = '1'; 
     } 
     if(sign_mag_array[q] == 'F'){ 
      sign_mag_array[q] = '0'; 
     } 

같은 그 반대의 경우도 마찬가지

int hex_to_int(char x) 
{ 
    return x <= '9' ? x - '0' : 10 + (x - 'A'); 
} 

char int_to_hex(int x) 
{ 
    return x < 10 ? '0' + x : 'A' + (x - 10); 
} 

이제 코드가됩니다 반복적 48 개 라인의

 if (sign_mag_array[q] >= '0' && sign_mag_array[q] <= '9' || 
     sign_mag_array[q] >= 'A' && sign_mag_array[q] <= 'F') 
    { 
     int digit = hex_to_int(sign_mag_array[q]); 
     sign_mag_array[q] = int_to_hex(15 - digit); 
    } 

코드가 아주 적게 줄어 들었습니다. 또한 보너스로 Zeta가 발견 한 문제도 해결합니다.

+0

나는 당신의 기능 존을 좋아한다! 하지만 내 배열의 모든 요소. 나는 여러 종류의 배열을 가질 수 있다고 생각하지 않는다. 함수를 편집하여 char 만 처리 할 방법을 찾고 있습니다. – Liondancer

+0

@Liondancer 죄송합니다. 내 코드에 오류가있었습니다. 나는 int_to_hex (15 자리)를 의미 할 때'15 - int_to_hex (digit);라고 썼다. 이제는 효과가있다. – john

2

덧붙여서 john에 대한 귀하의 논리는 현재 잘못되었습니다. 이다

if(sign_mag_array[q] == '1'){ 
     sign_mag_array[q] = 'F';   
    } 
    /* ... */ 
    if(sign_mag_array[q] == 'F'){ 
     sign_mag_array[q] = '1'; 
    } 

sign_mag_array[q] 경우 '1' 당신이 'F'로 설정됩니다 : 다음 코드에서보세요. 그러면 나중에 조건이 참이되며 따라서 sign_mag_array[q]'1'으로 재설정됩니다. 당신이 이미 독점가는

if(sign_mag_array[q] == '1'){ 
     sign_mag_array[q] = 'F';   
    } 
    else if(sign_mag_array[q] == '2'){ 
     sign_mag_array[q] = 'E';   
    } 
    /* ... */ 
    else if(sign_mag_array[q] == 'F'){ 
     sign_mag_array[q] = '1'; 
    } 

그리고 이후

당신은 단순히 대신 IFS의 긴 시퀀스의 switch를 사용할 수 있습니다 :

switch(sign_mag_array[q]){ 
    case 'F': sign_mag_array[q] = '1'; break; 
    case 'E': sign_mag_array[q] = '2'; break; 
    /* ... */ 
    case '1': sign_mag_array[q] = 'F'; break; 
} 
+0

방금 ​​내 코드를 엄청나게 단축했습니다! – Liondancer