当前位置: 首页 > article >正文

c语言:取绝对值

假设我们有一个 long 类型的变量 l,我们希望恢复其绝对值。以下是两种方法的对比:

方法1:使用条件语句

这个很好理解,负数时取负运算 ,用于数值的符号反转。

long abs_value(long l) {
    if (l < 0) {
        return -l;
    } else {
        return l;
    }
}
方法2:使用位操作
long abs_value(long l) {
    long s = l >> 63;  // 获取符号位
    l = (l + s) ^ s;   // 恢复绝对值
    return l;
}

      l为正数时,s=0;  (l+s)^s = l^0=l;对于任何整数与 0 进行按位异或操作的结果总是 其本身。

      l为负数时,s=-1,即0xffff ffff ffff ffff;
      这是因为long l的最高位为符号位,负数的最高位为1;右移操作会将变量的二进制表示向右移动指定的位数,空出的位数会用符号位的值来填充,l>>63,左侧空位全补1就得到0xffff ffff ffff ffff,该值对应-1。

在计算机中,负数以补码的形式表示。对于一个负数 x,其补码表示为:

  1. 取反(按位取反)。

  2. 加1。

   s=-1时, (l+s)^s = (l-1)^0xffff ffff ffff ffff  正好是负数取补码的逆过程,所以相当于获取了负数的绝对值。

方法2的优势:

1. 避免条件分支

使用条件语句(如 if 语句)会导致代码中出现分支。在现代处理器中,分支预测失败可能会导致性能下降。通过使用位操作,可以避免条件分支,从而提高代码的执行效率。

2. 提高性能

位操作通常比条件分支更快,因为它们直接在寄存器级别进行操作,而不需要进行复杂的控制流判断。这在性能敏感的应用中尤其重要。

3. 减少代码复杂性

虽然位操作可能看起来有些复杂,但它们实际上可以减少代码的复杂性,特别是在处理整数操作时。位操作通常更简洁,且不需要额外的变量或复杂的逻辑。

但是实际测试时,还是方法1的性能更高一些:

xxx@:~/test/c-func$ ./a.out
Time taken by abs_value_if: 4.517215 seconds
Time taken by abs_value_bit: 4.865139 seconds


 


http://www.kler.cn/a/537193.html

相关文章:

  • 使用 Let‘s Encrypt 和 OpenResty 实现域名转发与 SSL 配置
  • k8存储卷管理
  • android 适配 api 35(android 15) 遇到的问题
  • idea 找不到或者无法加载主类
  • 云计算——AWS Solutions Architect – Associate(saa)1、什么是云,AWS介绍
  • UE5 蓝图学习计划 - Day 14:搭建基础游戏场景
  • [笔记] 汇编杂记(持续更新)
  • HTML学习笔记(6)
  • ubuntu中如何在vscode的终端目录后显示(当前的git分支名) 实测有用
  • 组合总和II(力扣40)
  • centos7-mini-2009下载docker
  • Cloudflare 2024 网络流量回顾:洞悉网络发展趋势与安全挑战
  • 数据库读写分离、事务的特性、事务隔离级别及默认级别、脏读不可重复读和幻读、更新丢失问题、写偏斜问题、MVCC
  • 【开源免费】基于SpringBoot+Vue.JS智能学习平台系统(JAVA毕业设计)
  • 通过AutoHotkey将Windows按键修改为Mac的快捷键并设置开机自启动
  • 问题大集04-浏览器阻止从 本地 发起的跨域请求,因为服务器的响应头 Access-Control-Allow-Origin 设置为通配符 *
  • Vue3.5 企业级管理系统实战(五):图标组件
  • 远程 IO 模块:汽车零部件产线的高效生产引擎
  • AI智算-k8s部署DeepSeek Janus-Pro-7B 多模态大模型
  • 探索从传统检索增强生成(RAG)到缓存增强生成(CAG)的转变
  • selenium使用
  • Stable Diffusion的入门介绍和使用教程
  • 如何在Swift中实现基本的UI设计?
  • AI眼镜-推理成本降低将加速端侧硬件智能化-AI 眼镜、AI玩具、手机AI化
  • Mixture of Experts(专家混合模型)深入解析:突破传统神经网络的计算瓶颈
  • unity学习32:角色相关1,基础移动控制