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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix