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;
}
posted @   enbug  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示