Lua中检测32位序号环绕的方法

Lua中检测32位序号环绕的方法

lua 复制代码
--[[
    判断32位无符号序号a是否比b新(处理环绕)
    返回 true 表示a比b新,false 表示a比b旧或相等
--]]

--- 32位无符号时间戳升序比较器(处理回绕)
--- 判断 a 是否应该排在 b 前面,即 a 是否比 b 旧
--- @param a number 32位无符号整数
--- @param b number 32位无符号整数
--- @return boolean true 表示 a 比 b 旧,应排在前面
local function TimeComparator_Asc(a, b)
    if a == b then
        return false
    end
    -- 确保作为32位无符号数处理
    local a32 = a & 0xFFFFFFFF
    local b32 = b & 0xFFFFFFFF
    -- 计算 (a - b) mod 2^32
    local diff = (a32 - b32) & 0xFFFFFFFF
    -- 升序排序条件:如果 a 比 b 旧,则 (a - b) 的差值落在 [2^31, 2^32)
    -- 此时 diff >= 2^31
    return diff >= 0x80000000  -- 0x80000000 = 2^31
end

-- 方法一:取模运算(兼容 Lua 5.1+)
function is_newer_mod(a, b)
    local diff = (a - b) % 2^32
    return diff > 0 and diff < 2^31   -- 排除相等情况
end

-- 方法二:位运算(Lua 5.3+,效率更高)
function is_newer_bit(a, b)
    local a32 = a & 0xFFFFFFFF
    local b32 = b & 0xFFFFFFFF
    local diff = (a32 - b32) & 0xFFFFFFFF
    return diff ~= 0 and diff < 0x80000000  -- 0x80000000 = 2^31
end

-- 测试代码
local tests = {
    {100, 50, true},          -- 正常:100 > 50
    {50, 100, false},         -- 正常:50 < 100
    {1, 2^32-1, true},        -- 环绕:1 比 4294967295 新
    {2^32-1, 1, false},       -- 环绕:4294967295 比 1 旧
    {500, 500, false},        -- 相等
}

print("测试 is_newer_mod:")
for _, t in ipairs(tests) do
    local a, b, expected = t[1], t[2], t[3]
    local result = is_newer_mod(a, b)
    print(string.format("a=%u, b=%u → %s (期望 %s) %s",
        a, b, tostring(result), tostring(expected),
        (result == expected) and "✓" or "✗"))
end

print("\n测试 is_newer_bit:")
for _, t in ipairs(tests) do
    local a, b, expected = t[1], t[2], t[3]
    local result = is_newer_bit(a, b)
    print(string.format("a=%u, b=%u → %s (期望 %s) %s",
        a, b, tostring(result), tostring(expected),
        (result == expected) and "✓" or "✗"))
end

原理简述

32位无符号序号范围 0~4,294,967,295,当达到最大值后归零。判断新旧的标准:

  • 计算差值 diff = (a - b) mod 2^32,结果落在 [0, 2^32)。
  • diff < 2^31,说明 a 在 b 之后(新);否则 a 在 b 之前(旧)。
  • diff == 0 表示相等。

该算法利用"半个区间"规则,在环形空间内确定前进方向。

相关推荐
MC皮蛋侠客1 天前
Redis 系列(七):事务、Pipeline 与 Lua 脚本——从原子性到 Functions
数据库·redis·lua
AmyLin_20012 天前
AI 如何做出数学发现【5】- AI 数学证明怎样做单元测试:从“看起来顺”到可否证工作流
人工智能·单元测试·openai·数学推理·符号计算·ai推理·反例生成
是小艺吗。3 天前
第三方机构出具的软件功能测试报告的作用与流程说明,中承信安专业讲解
功能测试·单元测试·软件测试报告·软件功能测试·软件测评
l1t3 天前
用李红艳先生的DuckDB luajit插件批量计算数独
数据库·sql·lua·duckdb
测试老哥3 天前
软件测试:单元测试详解
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
回眸&啤酒鸭4 天前
【回眸】搞钱灵感——智能体 汽车软件单元测试与集成测试
单元测试·汽车·集成测试
小龙飞刀6 天前
Chrome插件自动化测试:单元测试、集成测试
chrome·单元测试·集成测试
LayZhangStrive7 天前
claude code使用命令技巧(四)(开发沉淀的提示词模板)
ai·单元测试·prompt·ai编程·提示词·claude code
智购科技自动售卖机厂家7 天前
从STM32到RK3588——自动售货机嵌入式主控方案的架构演进~YH
stm32·嵌入式硬件·物联网·架构·lua·零售·symfony