You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:15:02