生活随笔
收集整理的這篇文章主要介紹了
关于将一个数输出为原码、反码和补码的解惑
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
有這么一道題目:
編寫函數,實現輸入一個數,輸出該數的原碼、反碼和補碼
一開始我并沒有用位運算的思路,于是寫下了下面長長的一段代碼:
(假設我輸入-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("\nones-complement code is ");for (i
=b
+1; i
>=0; i
--) {c
=a
[i
];c
=~c
&1; printf("%d",c
);}printf("\ncomplemental code is ");for (i
=b
+1; i
>=0; i
--){printf("%d",a
[i
]);}printf("\n");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
=num
+1;printf("%d\n",num
);for (i
=0; i
<1000; i
++) {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("\nones-complement code is ");for (i
=b
+1; i
>=0; i
--) {c
=a
[i
];c
=~c
&1; printf("%d",c
);}printf("\ncomplemental code is ");for (i
=e
+1; i
>=0; i
--){printf("%d",d
[i
]);}printf("\n");return 0;
}int
main()
{int num
;printf("please input a number:\n");scanf("%d",&num
);if (num
>0) {positive(num
);}else if (num
==0)printf("0000000000000000\n1111111111111111\n0000000000000000");elsenegetive(num
);
}
沒有引入位運算會使得整個代碼冗長,不過復雜無所謂,正確就可以了。
可是他不正確啊。。對于正數的輸出是無問題的,一旦進入負數,其補碼就會錯誤。
為什么呢?我們把負數for循環部分單獨拎出來看一下:
num
=-numb
; num
=~num
; num
=num
+1; for (i
=0; i
<1000; i
++) {d
[i
]=num
%2; num
=num
/2;if (num
>-1){e
=i
;break;}}
于是我采用位運算寫法簡化了二進制輸出:
for(i
=15;i
>=0;i
--) {b
=a
>>i
; b
=b
&~(~0<<1); printf("%hd",b
); }}
這串代碼甚至不需要對正負數進行區分,如果是負數機器默認就是用補碼儲存,故直接讀出來就可以了。
總結
以上是生活随笔為你收集整理的关于将一个数输出为原码、反码和补码的解惑的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。