0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

跟大家分享位运算的几个使用小技巧

冬至配饺子 来源:最后一个bug 作者:bug菌 2022-07-28 11:16 次阅读

今天跟大家分享位运算的几个使用小技巧,这些巧妙操作都是要在项目开发或者学习中不断积累的,如果你在后续的编码中用上的话,不仅能够提高代码效率,还能为你的代码增色不少。

1、替代乘除2

这一点应该是基本操作了,我也在往期的文章中提到过多次。

poYBAGLh_p-AImFvAAA2W5GUlrE647.png

特别是常用定点MCU的朋友,相信一点更是有自己的领悟,即使所使用的MCU带有硬件浮点运算功能,采用整形定点运算也经常用来提高运算速度。

2、异或交换两数

也就是我们面试题中常提到的,不用第三个变量交换两个数:

pYYBAGLh_riAS7SuAAAifY87VMI082.png

3、判断两数是否同号

大部分朋友判断两个不为0的数是否同号都是采用两数相乘是否>0来进行判断,当然我也见过如下写法的:

pYYBAGLh_tGAIYCpAAAl5rOKOVI627.png

虽然两种最终的结果,但总让人觉得有点太初级、太累赘的感觉,所以代码还是要写得优雅,才让人觉得你有点东西。

如果你稍加处理借用异或运算来进行判断,会给人眼前一亮的感觉。

poYBAGLh_uKAQV2tAAAO2YTQSA0647.png

然而更重要的是相对乘法运算,其速度更快。

4、判断奇偶数

判断奇偶数无非就是识别该数是否能够被2整除,通常我们采用如下表达式:

pYYBAGLh_vmAEkGqAAANv2fRzT8353.png

既然本文介绍位运算,又存在某种位运算会更加高效:

poYBAGLh_yWAEqzlAAARc6-maaI723.png

其无非就是利用了奇偶整形数的二进制最后一位是否为1来进行区分。

4、实现绝对值

实现绝对值还不简单?abs用起来。

如果要不用条件语句实现绝对值功能,你会如何实现呢?

以8位整形数为例说明一下其实现,其他字长的整形类似处理:

poYBAGLh_z2AIu5OAAAU1x_YFBQ428.png

这里也算是异或的应用吧,异或操作"相同为0,相异为1",假如a是一个有符号正数整数,a^0仍然为a,所以如上表达式对于整数仍然为原数。

而当a是一个有符号负值整形数,要实现abs功能,势必要“对原数取反+1“,然而巧妙的是a^0xFF刚好是对a取反,-(a>>7)则刚好是+1。

属实巧妙,不禁有点喜欢上了异或操作运算。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17113

    浏览量

    350903
  • 位运算
    +关注

    关注

    0

    文章

    17

    浏览量

    8420
收藏 人收藏

    评论

    相关推荐

    请问有没有ADS5404匹配的运算放大器型号推荐呢?

    想使用ADS5404(ADS5402)自制一块板卡,前端的2路采集信号输入功率较小,想通过运算放大,请问有没有ADS5404匹配的运算放大器型号推荐呢?
    发表于 12-11 07:18

    4G模组Air780E的LuatOS开发之运算(bit)示例

    本文我要说的是低功耗4G模组Air780E的LuatOS开发,关于运算(bit)示例,我将详细解析分享给大家
    的头像 发表于 12-02 14:33 150次阅读
    4G模组Air780E的LuatOS开发之<b class='flag-5'>位</b><b class='flag-5'>运算</b>(bit)示例

    Air780E模组LuatOS开发的运算(bit)教程篇!

    本次我们要学习的是4G模组Air780E的LuatOS开发,关于运算(bit)教程分享给大家
    的头像 发表于 11-26 11:58 127次阅读
    Air780E模组LuatOS开发的<b class='flag-5'>位</b><b class='flag-5'>运算</b>(bit)教程篇!

    Verilog语法中运算符的用法

    verilog语法中使用以下两个运算符可以简化我们的选择代码。
    的头像 发表于 10-25 15:17 540次阅读
    Verilog语法中<b class='flag-5'>运算</b>符的用法

    技术干货驿站 ▏解锁C语言高效编程秘诀:深入解析运算符与优先级

    在C语言的学习过程中,运算符的使用是不可忽视的重要环节。本文将继续深入探讨C语言中的运算符,重点介绍运算符、赋值运算符及其优先级。掌握这些
    的头像 发表于 10-13 08:09 239次阅读
    技术干货驿站 ▏解锁C语言高效编程秘诀:深入解析<b class='flag-5'>运算</b>符与优先级

    TAS5825音量控制运算宽是多少,是32bit吗?

    对于dsp运算控制音量可能会有损音质,大概32bit运算在小音量是会有几db音质损失。 所以我想知道,TAS5825 音量控制运算宽是多少,是32bit?TI miniDSP产品中
    发表于 10-11 06:43

    51单片机(一款国产8高性能Flash的接近感应单片机XD08M3232体验感)

    大家推荐一款在淘宝上发现的国产A/D型具有增强型1T8051内核8高性能Flash的接近感应单片机XD08M3232,测试下来总体的感觉还是比较强大的,以下是本人试用后总结下来比较满意的几个
    发表于 09-25 15:15

    使用运算放大器应注意哪几个问题

    以下是使用运算放大器时应注意的几个关键问题: 运算放大器的基本原理 : 运算放大器是一种高增益、多用途的电子设备,广泛应用于信号放大、滤波、积分和微分等电路中。 了解其基本结构,包括输
    的头像 发表于 08-06 14:26 484次阅读

    关于带操作的疑问求解

    大家都知道,带有对应的带别名区,操作带别名区就可以写带区的BIT,读取带BIT值到内部
    发表于 05-17 07:33

    verilog实现卷积运算

    在Verilog中实现卷积运算,你可以使用以下示例代码。这里假设输入数据是有符号8数,输出数据也是有符号8数。卷积在数字信号处理中通常指的是两个序列的逐元素乘积的和,也就是点乘。 module
    发表于 03-26 07:51

    verilog语音实现浮点运算

    Verilog可以通过使用IEEE标准的浮点数表示来实现浮点运算。下面是一个基本的Verilog模块示例,展示了如何进行加法、乘法和除法等常见的浮点运算操作: module
    发表于 03-25 21:49

    运算放大器同向输入端和反向输入端怎么区分

    运算放大器(Operational Amplifier,简称 Op-Amp)是一种重要的电子元件,在模拟电路中有着广泛的应用。运算放大器具有以下几个主要特点
    发表于 03-25 12:37 9774次阅读
    <b class='flag-5'>运算</b>放大器同向输入端和反向输入端怎么区分

    STM32开发中的运算以及带操作

    STM32开发中的运算以及带操作  运算是计算机中常用的一种操作方式,特别适用于对数据的单个或多个位进行操作。在STM32开发中,
    的头像 发表于 02-02 14:38 1605次阅读

    运算放大器为什么要采用差分放大?

    运算放大器采用差分放大是因为差分放大器具有以下几个优点
    的头像 发表于 01-04 18:16 1075次阅读

    ADE7753功率因数是由哪几个寄存器运算得到的?

    电压使用1M:1K的电阻分压后送入芯片,电流使用锰铜片采样送入芯片。负载1000W的用电设备,ADE7753的哪几个或哪一个寄存器地址是读取后经过运算得到这个1000W的值的。功率因数是由哪几个寄存器
    发表于 12-27 08:16