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

    文章

    16022

    浏览量

    343694
  • 位运算
    +关注

    关注

    0

    文章

    16

    浏览量

    8385
收藏 人收藏

    评论

    相关推荐

    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 785次阅读
    <b class='flag-5'>运算</b>放大器同向输入端和反向输入端怎么区分

    如何使用SBench6软件对数字化仪采集信号进行处理?(二)——平均运算功能

    上一篇文章介绍了了德思特SBench 6为板卡式数字化仪提供的波形算术运算及直方图功能。本章将继续为大家SBench 6的平均运算功能。
    的头像 发表于 01-15 14:05 166次阅读
    如何使用SBench6软件对数字化仪采集信号进行处理?(二)——平均<b class='flag-5'>运算</b>功能

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

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

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

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

    ad7177-2读到的32数据哪几个位时状态寄存器的4个通道?

    数据手册上:如果使能32数据转换,则每次读取数据时,ADC输出28数据加状态寄存器的4个通道。 读到的32数据哪几个位时状态寄存器的4个通道?
    发表于 12-12 07:59

    运算放大器应用设计的几个技巧分享

    一、如何实现微弱信号放大? 传感器+运算放大器+ADC+处理器是运算放大器的典型应用电路,在这种应用中,一个典型的问题是传感器提供的电流非常低,在这种情况下,如何完成信号放大? 对于微弱信号
    发表于 11-22 06:36

    arduino的运算性能stm8哪个更强一点?

    实际的处理应该是哪个
    发表于 11-01 07:46

    求助,在51单片机哪几个特殊功能寄存器是16的?

    几个才是16的呢
    发表于 11-01 06:30

    Python中常见的条件运算符有哪些

    x not in y x不是y容器的成员 在Python中,比较运算和赋值运算是可以连接的——几个运算符可以连在一起使用,比如:0 有些运算
    的头像 发表于 09-12 16:47 979次阅读

    可靠的液检测方案有没有,大家做过哪种?

    可靠的液检测方案有没有,大家做过哪种?检测液深度和液面位置。
    发表于 06-15 07:25

    Virtual Input/Output IP核的几个重要参数

    大家好!今日给大家介绍下Virtual Input/Output IP 核的几个重要参数。
    的头像 发表于 06-01 09:18 845次阅读
    Virtual Input/Output IP核的<b class='flag-5'>几个</b>重要参数

    SAS运算符in在宏语句中的应用

    前面通过对SAS Base的学习,我想大家对in运算符并不陌生,它广泛的应用于数据步或SQL条件语句中,进行条件判断或数据筛选,进而访问特定观测值。
    的头像 发表于 05-19 14:38 1438次阅读
    SAS<b class='flag-5'>运算</b>符in在宏语句中的应用

    运算放大器的环路稳定性

    放大器的稳定性。本文比较长,为了更有目的性的阅读,大家可以带着以下几个问题点去详细阅读本文,并在阅读完之后再回头来看看这些问题是否都得到了很好的答案。
    发表于 05-06 11:23 4371次阅读
    <b class='flag-5'>运算</b>放大器的环路稳定性