2017-01-27 3 views
1

私は論理ステートメントとバイナリ算術演算子だけを使って2つの2進数を一緒に追加しようとしています。しかし、私はビットを実際に変更する方法を混乱させる。それは主に変更しようとしている変数ですが、印刷するたびにゼロになっています。あなたのforループの中にこれらのステートメントのそれぞれで32ビット整数のバイトを変更するにはどうすればよいですか?

#include <stdio.h> 

void execute_add(int a, int b){ 

int i = 0; 
int bit; 
int bit2; 
int carryOut = 0; 
int out = 10; 
int overflow = 0; 

for(i = 0; i <32 ; i++){ 

    bit = (a >> i) & 1; 
    bit2 = (b >> i) & 1; 

    if(bit==1 && bit2==1 && carryOut == 0){ 
     carryOut = 1; 
     out = 0 | (0x1 >> i); 

    }else if(bit==1 && bit2==1 && carryOut == 1){ 
     carryOut = 1; 
     out = 1 | (0x1 >> i); 

    }else if(bit==0 && bit2==0 && carryOut == 0){ 
     carryOut = 0; 
     out= 0 | (0x1 >> i); 

    }else if(bit==0 && bit2==0 && carryOut == 1){ 
     carryOut = 0; 
     out = 1 | (0x1 >> i); 

    }else if(bit==1 && bit2==0 && carryOut == 0){ 
     carryOut = 0; 
     out = 1 | (0x1 >> i); 

    }else if(bit==1 && bit2==0 && carryOut == 1){ 
     carryOut = 1; 
     out = 0 | (0x1 >> i); 

    }else if(bit==0 && bit2==1 && carryOut == 0){ 
     carryOut = 0; 
     out = 1 | (0x1 >> i); 

    }else if(bit==0 && bit2==1 && carryOut == 1){ 
     carryOut = 1; 
     out = 0 | (0x1 >> i); 

    }else{ 

    }//if else 

}//for loop 

    printf("\n"); 

    bit = (a >> 31) & 1; 
    bit2 = (a >> 31)& 1; 
    int bit3 = (out >> 31) & 1; 

    if(bit == 1 && bit2== 1 && bit3 == 0){ 
    overflow = 1; 

    }else if (bit == 0 && bit2 == 0 && bit3 == 1){ 
    overflow = 1; 

    }else{ 

    }//overflow check 

    int j; 
    int g = 0; 

    for(j = 31; j>=0; j--){ 

      if(g%4==0 && g!=0){ 
      printf(" "); 
      } 

     bit2 = (out >> j) & 1; 

     printf("%d", bit2); 
     g++; 
    } 

      printf("\n"); 
} 

int main(){ 

    int a = 34; 
    int b = 17; 

    execute_add(a, b); 
    return 0; 
} 
+1

デバッガを使用して、コードを1行ずつステップ実行します。 'bit2 =(out >> i)& 1; '。デバッガを使って答えます。その時点でどの値が「i」ですか? 'i'の代わりに' j'を使うことを意味しましたか? – kaylum

+0

良いキャッチ!しかし、out変数が0であるという問題はまだ残っています。 –

+1

'(0x1 >> i)'は 'i> 0'に対して0です。 – stark

答えて

1

out = 0 | x; 

あなたはoutをリセットし、あなたが既にやったすべての作業を一掃しています。おそらく行うには意味:

out = out | x 

または、同等に、

out |= x 

あなたはまた、すべてのあなたが探しているものではない場所、上の右シフト1です。 0より大きいシフトの場合、それはあなたにゼロを与えます。私はあなたがしばしば右シフトを使う左シフトを探していると思います。

私は、デバッガの使用に関するkaylumのコメントを2番目に挙げます。適切なシフトとをoutと適切にフリップしても、デバッガで簡単に修正できるロジックエラーが発生します。

+0

おかげで、デバッガが本当に助けになりました –

関連する問題