Julia中查找UInt16位掩码内1的位置的更高效实现方法
实现优化方案
你原有实现依赖字符串生成、遍历匹配操作,会产生大量不必要的开销,直接基于位运算处理的版本执行效率会高很多,内存占用也更低。
首先需要你根据自身的引脚编号规则选择对应实现:
情况1:引脚编号对应二进制位的常规编号(最低位为第0位,从右往左计数)
这是硬件开发领域通用的位编号规则,示例值0x3c00(二进制0011110000000000)会返回[10, 11, 12, 13]
function read_message(hex_rep::UInt16) pins = Int[] sizehint!(pins, 16) # 预分配最多16个元素的空间,避免动态扩容开销 @inbounds for i in 0:15 if (hex_rep >>> i) & 0x01 == 1 push!(pins, i) end end return pins end
更简洁的写法性能同样优异:
read_message(hex_rep::UInt16) = [i for i in 0:15 if isodd(hex_rep >>> i)]
情况2:兼容你原有代码的输出逻辑(和bitstring输出顺序一致,从左往右1-based索引)
示例值0x3c00会返回[3, 4, 5, 6],和你原有函数输出完全一致:
function read_message_compat(hex_rep::UInt16) pins = Int[] sizehint!(pins, 16) @inbounds for i in 0:15 if (hex_rep >>> (15 - i)) & 0x01 == 1 push!(pins, i+1) end end return pins end
性能说明
位运算版本相比你原有字符串版本,性能提升可达10倍以上,内存分配仅为原有版本的1/5不到,处理大批量UInt16数据时优势会更明显。如果需要处理整个UInt16数组,直接对数组广播调用函数即可:read_message.(uint16_arr)。
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

