1つの数を元の符号、逆符号、および補符号に出力する解惑について

22231 ワード

このような問題があります.
関数を編纂して、1つの数を入力することを実現して、その数の原符号、逆符号と補符号を出力します
最初はビット演算の考えがなかったので、次の長いコードを書きました.(入力-1754と仮定します)
#include <stdio.h>
#include <math.h>

int positive(int num) //      
{
    int i,a[1000],b=1,c;
    for (i=0; i<1000; i++) {
        a[i]=num%2;
        num=num/2;
        if (num<1)
        {
            b=i;
            break;
        }
    }
    a[b+1]=0;
    printf("ture code is ");
    for (i=b+1; i>=0; i--)
    {
        printf("%d",a[i]);
    }
    printf("
ones-complement code is "
); for (i=b+1; i>=0; i--) { c=a[i]; c=~c&1; // , 11111111 c printf("%d",c); } printf("
complemental code is "
); for (i=b+1; i>=0; i--) { printf("%d",a[i]); } printf("
"
); return 0; } int negetive(int num) // { int i,a[1000],d[1000],b=1,c,e = 0,numb; numb=num; num=-num; for (i=0; i<1000; i++) { a[i]=num%2; num=num/2; if (num<1) { b=i; break; } } num=-numb; num=~num; // num -1755, num=num+1; printf("%d
"
,num); for (i=0; i<1000; i++) {// for d[i]=num%2; num=num/2; if (num>-1) { e=i; break; } } a[b+1]=1; d[e+1]=1; printf("ture code is "); for (i=b+1; i>=0; i--) { printf("%d",a[i]); } a[b+1]=0; printf("
ones-complement code is "
); for (i=b+1; i>=0; i--) { c=a[i]; c=~c&1; // 11111111 printf("%d",c); } printf("
complemental code is "
); for (i=e+1; i>=0; i--) { printf("%d",d[i]); } printf("
"
); return 0; } int main() // { int num; printf("please input a number:
"
); scanf("%d",&num); if (num>0) { positive(num); } else if (num==0) printf("0000000000000000
1111111111111111
0000000000000000"
); else negetive(num); }

ビット演算を導入しないとコード全体が冗長になりますが、複雑でどうでもいいので、正しくすればいいです.しかし、彼は正しくないですね.の正数の出力は問題なく、負数に入るとその符号化が誤ります.どうしてですか.負の数forサイクル部分を単独で持ち出してみましょう.
num=-numb; //    num    1754
    num=~num;  // 1754   ,  num     -1755,                ,                     ,             
    num=num+1;  //    -1755+1=-1754
    for (i=0; i<1000; i++) //    for      , -1754       
    {
        d[i]=num%2;  //       
        num=num/2;
        if (num>-1)
        {
            e=i;
            break;
        }
    }  //      ,            

そこで私はビット演算方式を採用してバイナリ出力を簡略化しました.
  for(i=15;i>=0;i--)  //  16 
        {
            b=a>>i;     //             
            b=b&~(~0<<1);   //  xcode            ,   b=b&~(~0-1)   
            printf("%hd",b); 
        }
    }

この一連のコードは正負数を区別する必要もなく、負数機械であればデフォルトでは補符号で格納されるので、直接読めばよい.