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

寻求最快解决方案

有两个Ulong的数L1和L2,需要将L1的第n位(bit)设置成L2的第m位(bit)。
比如L1为(binary)10101000010.....(共64位,Low ->High),L2为(binary)0101110001....(共64位Low ->High),设置L1的第3位(现在是1)为L2的第1位(现在是0)。
我写了一个算法,但是发现速度不快(用在加密算法里面),大部分时间消耗在判断上了。不知道各位能不能写出速度更快的代码,或者有其他优化技巧。以下是我写的算法,大家看看~~~期待着大家的回答。谢谢!

None.gif Private   Const  ULong_1  As  ULong  =   CType ( 1 , ULong)  ' 全部是1的ULong
ExpandedBlockStart.gifContractedBlock.gif
Public   Sub SetBit() Sub SetBit(ByRef L1 as ULong,ByVal n As IntegerByVal L2 As ULong, ByVal m As Integer)
InBlock.gif        
If (L2 And (ULong_1 << m)) = 0 Then
InBlock.gif            L1 
= L1 And Not (ULong_1 << n)
InBlock.gif        
Else
InBlock.gif            L1 
= L1 Or (ULong_1 << n)
InBlock.gif        
End If
ExpandedBlockEnd.gif
End Sub

经过苦思冥想,问题解决:
ExpandedBlockStart.gif ContractedBlock.gif      Sub SetBit() Sub SetBit(ByRef L1 As ULong, ByVal n As IntegerByRef L2 As ULong, ByVal m As Integer)
InBlock.gif        L2 
= (L2 >> m) And CULng(&H1)
InBlock.gif        L1 
= L1 And Not (CULng(&H1 << n))
InBlock.gif        L1 
= L1 + (L2 << n)
ExpandedBlockEnd.gif    
End Sub
现在执行1000000次也只需要31.25ms,速度已经达到要求了。
思路如下:
思路为把L2中的m那一位移到最右边,然后和1取AND,这样就把m这位取出来了。对于L1,我把n这一位设置为0,也就是AND 111111..0...111这样,111111..0...111来自1<<n然后取反。最后把L1中取得的那一位和L2 AND以后的值相加即可。

相关文章:

  • [MAT]使用MAT比較多个heap dump文件
  • nagios 主机状态
  • FZU 1692 Key problem (构造矩阵)
  • 【分享】通过Excel生成批量SQL语句,处理大量数据的好办法
  • SGU 122 The book(构造)
  • 全局dialog,在小米4及部分机型上不能正常弹出
  • DOM常用操作
  • docker学习笔记7:发布镜像到docker hub上
  • Java通过wait()和notifyAll()方法实现线程间的通信
  • Ado.NET SQLHelper
  • ubuntu14.04 忘记root密码
  • 神奇语言python文件操作
  • Microsoft SQL Server登陆Linux
  • VSCode Python开发环境配置
  • 企业是怎么给MYSQL赋予用户权限
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • crontab执行失败的多种原因
  • git 常用命令
  • HTML-表单
  • HTTP请求重发
  • leetcode388. Longest Absolute File Path
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • ubuntu 下nginx安装 并支持https协议
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 和 || 运算
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 再谈express与koa的对比
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 仓管云——企业云erp功能有哪些?
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (4)Elastix图像配准:3D图像
  • (rabbitmq的高级特性)消息可靠性
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (规划)24届春招和25届暑假实习路线准备规划
  • (一)appium-desktop定位元素原理
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)Scala的“=”符号简介
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .Net Core和.Net Standard直观理解
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET微信公众号开发-2.0创建自定义菜单
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [Android Pro] Notification的使用
  • [Android View] 可绘制形状 (Shape Xml)
  • [AX]AX2012 R2 出差申请和支出报告
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [C/C++]关于C++11中的std::move和std::forward
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [C++] 多线程编程-thread::yield()-sleep_for()