二进制:由01串组成
下面假设一个字节8位(当然我们现在用的计算机都是64位)
正数的二进制:1的二进制为 00000001
负数的二进制(补码):将该负数的绝对值所对应的二进制,按位取反,然后+1
-1:先将1按位取反,11111110,然后+1,所以-1的二进制为 11111111
正数的二进制比较好办,直接打印即可。那么负数的而二进制就一定要先把对应的绝对值的二进制先算出来,然后按位取反,然后+1吗,其实不必。不难得出,除了最高位外,一个数的对应的正数和负数的二进制相加的每一位都是1,就是计算机一个字节能表示的最大的那个数(由于假设一个字节8位,第一位为符号位,所以最大整数所对应的二进制为01111111)。所以负数我们直接先把最高位设为1,然后其余位就是最大的那个数减去这个负数所对应的绝对值,换句话说,负数最高位为1,其余位为最大的那个数加上这个负数所对应的二进制。
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
char s[8]; //假设一个字节8位
int int_to_bin(int num) //整数转二进制
{
for(int i=7;i>=0;i--){
if(num&1){
s[i]='1';
}
else s[i]='0';
num=num>>1;
}
return 0;
}
int main()
{
int ans=pow(2,7); //8位 所能表示的最大的二进制
while(scanf("%d",&n)==1){
if(n>=0){ //正数
int_to_bin(n);
for(int i=0;i<8;i++){
printf("%c",s[i]);
}
printf("\n");
}
else { //负数
printf("1"); //最高位
int_to_bin(ans+n);
for(int i=1;i<8;i++){ //其余位 最大数加上那个负数
printf("%c",s[i]);
}
printf("\n");
}
}
return 0;
}