c不判断求整数的绝对值
所需知识:
正数的绝对值还是本身;
负数的绝对值是它的相反数(正数);
正整数负整数还有0在计算机里都是以补码的形式存放的。
正数补码的符号位为0
负数补码的符号位为1
一个二进制位与1异或相当于取反;
一个二进制位与0异或不变;
求一个数相反数的补码的一种方法是对这个数每个位取反最后加1;
所以,我们只需要取输入数的符号位,与这个数的每个位异或,最后再加上符号位就可以求出绝对值了。
1)对正数来说:每个位与符号位0异或,其值不变,最后再加上符号位0,仍是原数。
2)对负数来说:每个位与符号位1异或,最后再加上1,想当于求它相反数的补码,由于计算机中整数得存储方式是补码,所以求得结果也就是它的相反数。
3)对于0来说:虽无正负之分,但符号位也是0,所以其情况与正数一样。
实现:
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
int back = a;
int bit1 = (a>>31)&1;//取符号位
for (int i = 0; i < 32; i++)//用符号位与每个位异或
a = a ^ (bit1 << i);
a = a + bit1;//加上符号位
printf("fabs(%d)=%d\n", back, a );
return 0;
}
其实可以不用for循环直接查表,不过查表应该也属于判断,有点不合题意了^_^
如下:
#include <stdio.h>
int main()
{
int a;
unsigned hh[2] = {0, 0xffffffff };
scanf("%d", &a);
int back = a;
int bit1 = (a>>31)&1;//取符号位
a = a^hh[bit1];//用符号位与每个位异或
a = a + bit1;//加上符号位
printf("fabs(%d)=%d\n", back, a );
return 0;
}
浙公网安备 33010602011771号