假设验证数 m 的奇偶性:

  1. 一般会想到直接用求余运算,即 m % 2;
  2. 用位运算也可以达到一样的效果,即 m & 1;式子就是求二进制末尾的数是 0 还是 1;

二者的运算都是奇数返回1,偶数返回0;但是最近遇到一道题,在验证的时候二者的运行速度差距比较大

(先说结果:位运算  优于 求余运算),针对这个问题,我进行了测试,代码如下:

测试编译器:QT Creator自带编译器

#include <iostream>
using namespace std;
#include <time.h>//分别进行了 求余-位运算-求余-位运算 4次计算;
//每次用了100万个数,返回两次求余数和两次位运算的平均值;
pair<double,double> testMod(){double t_mod1,t_mod2,t_bit1,t_bit2;//01模块:求余clock_t start = clock();//测试块-----------int arr1[500000];for(int i = 0; i < 1000000; i++){int  m = i%2;if(m == 0)arr1[m/2] = m;}//------------clock_t ends = clock();t_mod1 = (double)(ends - start)/ CLOCKS_PER_SEC;//02模块:位运算clock_t start2 = clock();//测试块-----------int arr2[500000];for(int i = 0; i < 1000000; i++){int  m = i&1;if(m == 0)arr2[m/2] = m;}//------------clock_t ends2 = clock();t_bit1 = (double)(ends2 - start2)/ CLOCKS_PER_SEC;//03模块:求余clock_t start3 = clock();//测试块-----------int arr3[500000];for(int i = 0; i < 1000000; i++){int  m = i%2;if(m == 0)arr3[m/2] = m;}//------------clock_t ends3 = clock();t_mod2 = (double)(ends3 - start3)/ CLOCKS_PER_SEC;//04模块:位运算clock_t start4 = clock();//测试块-----------int arr4[500000];for(int i = 0; i < 1000000; i++){int  m = i&1;if(m == 0)arr4[m/2] = m;}//------------clock_t ends4 = clock();t_bit2 = (double)(ends4 - start4)/ CLOCKS_PER_SEC;return pair<double,double>( (t_mod1+t_mod2)/2,  (t_bit1+t_bit2)/2);
}int main()
{double mod_time = 0, bit_time = 0;pair<double,double>res;int times = 100; //测试次数int win = 0;for(int i = 0; i < times; i++){res = testMod();mod_time += res.first;bit_time += res.second;if(res.first > res.second)win++;}cout<<"mod Time: "<<mod_time/times<<endl;cout<<"bit Time: "<<bit_time/times<<endl;cout<<"bit win: "<<win<<endl;return 0;
}

测试时,若main函数中的 times = 1时,差距不明显

mod Time: 0.0036635
bit Time: 0.0031245
bit win: 1

times = 10

mod Time: 0.00286435
bit Time: 0.0025851
bit win: 10

times = 100

mod Time: 0.00228572
bit Time: 0.00211616
bit win: 100

times = 1000

mod Time: 0.00221833
bit Time: 0.00208492
bit win: 996

可以看出,位运算总体还是优于求余运算的。

C++验证奇偶性时求余运算%和位运算的速度比较相关推荐

  1. java取余位运算_Java位运算基础知识

    在学习Java运算时,补充学习Java位运算. Java位运算 位运算都是针对整数的补码进行位运算. & 按位与运算 先将整数转换为补码 ,然后执行按位与运算,最后将结果返回为十进制,它有如下 ...

  2. [GO语言基础] 四.算术运算、逻辑运算、赋值运算、位运算及编程练习

    作为网络安全初学者,会遇到采用Go语言开发的恶意样本.因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识:另一方面是分享与读者,希望大家一起进步.前文介绍了Golang的 ...

  3. 位移运算 java_java位运算位移运算

    位运算:位运算允许对整数中的单个比特进行操作.位运算会对连个操作数中对应的比特执行布尔代数运算,并产生一个结果. java中有3种位运算符:&(与) |(或) ^(异或) ~(非) 看例子说明 ...

  4. 对位运算 负数位运算的理解

    对位运算 负数位运算的理解 位运算大法好- 在这里,我拿洛谷P2104的题当作例题 题目: 小Z最近学会了二进制数,他觉得太小的二进制数太没意思,于是他想对一个巨大二进制数做以下 4 种基础运算: 运 ...

  5. 取模运算性质_求余、取模运算在RTOS中计算优先级的理解

    uCOS3中的部分源码: /* 置位优先级表中相应的位 */ void OS_PrioInsert (OS_PRIO prio) { CPU_DATA bit; CPU_DATA bit_nbr; O ...

  6. 【转】数学与编程——求余、取模运算及其性质

    一.求余运算(Remainder) (参考维基百科: http://zh.wikipedia.org/wiki/余数  http://en.wikipedia.org/wiki/Remainder h ...

  7. 取模运算性质_数学与编程——求余、取模运算及其性质 | 学步园

    一.求余运算(Remainder) http://zh.wikipedia.org/wiki/同余) Euclidean division:Given two integers a and b, wi ...

  8. python模运算求余_取模运算和取余运算

    取模运算和取余运算 取模运算( " Modulo Operation " )和取余运算 ( " Complementation " )两个概念有重叠的部分但又不 ...

  9. 求余运算转换为位运算

    因为求余运算要用到除法,除法是比较费时的.因此高性能的程序需要对求余进行转换. 如果被求余数是2的整数次幂,可以用位运算来进行转换,从而得到比较高的效率. 例如求 n % 32 = ??? 可以将其转 ...

  10. java取余位运算_java位运算

    位移动运算符: < 例如:3 <<2(3为int型) 1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011, 2)把该数字高位(左侧 ...

最新文章

  1. 云计算,能回答地球最终流浪到哪里吗?
  2. apache在win2003下的安全设置
  3. 网络攻防 第三周学习总结
  4. 远程桌面无法复制文本时解决办法
  5. 理解 Java 核心基础精髓
  6. bzoj1015 [JSOI2008]星球大战 并查集
  7. 老司机如何找素材,如何找灵感?
  8. 带你入门SpringCloud统一配置 | SpringCloud Config
  9. 软考信息系统项目管理师_项目整体管理---软考高级之信息系统项目管理师010
  10. 测试库的接收到的数据是否完整(jrtplib为列)
  11. Excel 枢纽图(Pivot)快速入门与示例
  12. python中rgb颜色_python颜色显示
  13. 08-微信小程序商城 销售排行(微信小程序商城开发、小程序毕业设计、小程序源代码)(黄菊华-微信小程序开发教程)
  14. 发送网页内容到onenote_将网页中的信息快速添加到OneNote笔记本的方法
  15. 前端多语言开发,如何中英文切换
  16. 阅读这篇文章,假设你不知道的傅里叶变换,然后来掐死我
  17. 音频设置 audio
  18. UML建模之——时序图(待整理)
  19. php圆的周长_php面向对象编程练习:计算矩形、三角形、圆形的周长和面积
  20. 《程序原本-追溯程序原本之书》读书笔记

热门文章

  1. php校园一卡通系统
  2. 软件开发工作量的估算方法
  3. 6,JESD204B接口简介
  4. mac 修改 hosts 文件之后,刷新 DNS 缓存
  5. 实用的Win10各个类型精品软件集锦
  6. rs485串口转网口设置
  7. jar 加入本地maven仓库
  8. scratch编程滑雪者游戏教程
  9. CYQ.Data V5 分布式自动化缓存设计介绍
  10. mysql是bsd协议吗_五种开源协议(GPL,LGPL,BSD,MIT,Apache)介绍