最近在练习位操作相关的编程,遇到了这样的一个题目,设一个函数,使给出一个数的原码能够得到该数的补码,大家都知道,正数的原码和补码是相等的,负数的补码求得需要一系列的转换,负数求补码的算法如下:
1、求得负数的绝对值;
2、对该绝对值进行取反操作;
3、对取反之后的绝对值加1。
根据上面是算法,编写的程序如下:
#include <stdio.h>
typedef unsigned short int ui16;
typedef short int i16;
int main()
{
i16 num;
void buma(i16 a); //原码转换补码函数
printf("请输入求补码的数值:\n");
scanf("%hd",&num);
buma(num);
}
void buma(i16 a)
{ i16 i;
i16 b;
if(a>0)//当原码为正值的时候
{
printf("%hd的补码为:\n",a);
for(i=15;i>=0;i--)
{
b=a>>i;
b=b&~(~0<<1);
printf("%hd ",b);
}
}
if(a<0)//当原码为负值的时候
{
a=-a;
a=~a;
a=a+1;
printf("%hd的补码为:\n",a);
for(i=15;i>=0;i--)
{
b=a>>i;
b=b&~(~0<<1);
printf("%hd ",b);
}
}
}