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 表示相等。

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

相关推荐
专吃海绵宝宝菠萝屋的派大星10 分钟前
使用postman测试自己编写的mcp服务
测试工具·lua·postman
一个有温度的技术博主3 小时前
Lua语法详解:从变量声明到循环遍历的避坑指南
redis·缓存·lua
上海合宙LuatOS4 小时前
LuatOS扩展库API——【exmodbus】MODBUS协议
物联网·lua·luatos
一个有温度的技术博主5 小时前
Lua语法进阶:函数封装与条件控制的艺术
redis·分布式·缓存·lua
程序员zgh6 小时前
C/C++ 单元测试系统 构建
c语言·开发语言·c++·学习·单元测试
橘子编程6 小时前
软件测试全流程实战指南
java·功能测试·测试工具·junit·tomcat·压力测试·可用性测试
汽车仪器仪表相关领域7 小时前
广州文明机电 新能源汽车运行安全性能检验解决方案
人工智能·功能测试·安全·单元测试·汽车·压力测试·可用性测试
小李云雾1 天前
FastAPI 后端开发:文件上传 + 表单提交
开发语言·python·lua·postman·fastapi
兰.lan2 天前
【黑马ai测试】黑马头条登录功能测试-发布功能测试-其他功能模块设计
软件测试·人工智能·笔记·python·功能测试·ai·单元测试
曼巴UE52 天前
Unlua 官方案例
c++·ue5·lua·ue