模拟实现abs()

简介: 模拟实现abs()

abs()库函数原型

image.png

  • 返回类型:int
  • 引用头文件:#include<stdlib.h> 或者#include<math.h>

作用

  • 作用:求一个数的绝对值


实例

#include<stdio.h>
#include<math.h>
int main()
{
  int n1 = -1;
  double n2 = -3.14;
  printf("%d %d", abs(n1), abs(n2));
  return 0;
}
复制代码

image.png参数不是int类型,而是其它类型,虽然可以通过,但是会报警告image.png



模拟实现abs()函数


思路

基础知识1.


首先: tmp = n >> 31

若n为正数:tmp的结果为0

若n为负数:tmp的结果为-1



基础知识2

算术右移 -当前VS2019:采取的是算术右移,右边舍弃,左边补符号位0


最高位为符号位   正数:0  负数:-1 所以如果是正数:最高位为0,右移补符号位0 右移31位结果:00000000 00000000 00000000 00000000 ->0 如果是负数 :最高位为1,右移补符号位1 右移31位结果:11111111 11111111 11111111 11111111 ->-1 补码为全1序列 10进制代表的值为-1


代码

int my_pow(int n)
{
    int tmp = n >>31; //正数:tmp = 0  负数:tmp = -1
    return (n ^ tmp) - tmp;
}
int main()
{
    int n = 0;
    scanf("%d",&n);
    int ret = my_pow(n);
    printf("%d\n",ret);
    return 0;
}
复制代码


代码分析

int tmp = n >>31; //正数:tmp = 0  负数:tmp = -1
    return (n ^ tmp) - tmp;
复制代码

  • 若n为正数:tmp = 0   n ^tmp 还是n ( 因为0^a = a )

n^tmp - tmp = n - 0 = n**


  • 若n为负数: tmp = -1


结论:==-n ^ -1 = n-1==      无论n为任意实数(包括0,正负数都满足) 所以 n^tmp - tmp = n



相关文章
|
10月前
|
算法
判断2..100以内的质数--sqrt
判断2..100以内的质数--sqrt
46 0
|
4月前
|
算法 安全 大数据
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析(二)
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析
141 0
|
3月前
Math.atan2求角度解析
`Math.tan(x/y)` 求得是与y轴的夹角,而 `Math.atan2(y, x)` 求得是与x轴的夹角(范围:\(-\pi\) 到 \(\pi\)),顺时针为负,逆时针为正。`Math.atan2` 函数注意点:y在前,x在后。它能正确处理各象限的角度,例如 `Math.atan2(1, 1)` 返回 \(\frac{\pi}{4}\),而 `Math.atan2(-1, -1)` 返回 \(-\frac{3\pi}{4}\)。
35 0
Math.atan2求角度解析
|
4月前
|
算法 安全 数据安全/隐私保护
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析(一)
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析
292 0
|
4月前
abs() 函数:返回一个数的绝对值
abs() 函数:返回一个数的绝对值
36 0
|
算法 数据挖掘 Python
math与random的关系与作用
math与random的关系与作用
86 0
4.2、Math数学对象(floor、random、sqrt、pow、abs)
4.2、Math数学对象(floor、random、sqrt、pow、abs)
167 0
【LeetCode470】用 Rand7() 实现 Rand10()(拒绝采样)
已知 rand_N() 可以等概率的生成[1, N]范围的随机数 那么: (rand_X() - 1) × Y + rand_Y() => 可以等概率的生成[1, X * Y]范围的等概率随机数 即实现了 rand_XY()
123 0
【LeetCode470】用 Rand7() 实现 Rand10()(拒绝采样)
【1117】Eddington Number (25分)【模拟】
【1117】Eddington Number (25分)【模拟】 【1117】Eddington Number (25分)【模拟】
82 0