Lua中检测32位序号环绕的方法
Lua中检测32位序号环绕的方法--[[ 判断32位无符号序号a是否比b新处理环绕 返回 true 表示a比b新false 表示a比b旧或相等 --]]-- 方法一取模运算兼容 Lua 5.1functionis_newer_mod(a,b)localdiff(a-b)%2^32returndiff0anddiff2^31-- 排除相等情况end-- 方法二位运算Lua 5.3效率更高functionis_newer_bit(a,b)locala32a0xFFFFFFFFlocalb32b0xFFFFFFFFlocaldiff(a32-b32)0xFFFFFFFFreturndiff~0anddiff0x80000000-- 0x80000000 2^31end-- 测试代码localtests{{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_,tinipairs(tests)dolocala,b,expectedt[1],t[2],t[3]localresultis_newer_mod(a,b)print(string.format(a%u, b%u → %s (期望 %s) %s,a,b,tostring(result),tostring(expected),(resultexpected)and✓or✗))endprint(\n测试 is_newer_bit)for_,tinipairs(tests)dolocala,b,expectedt[1],t[2],t[3]localresultis_newer_bit(a,b)print(string.format(a%u, b%u → %s (期望 %s) %s,a,b,tostring(result),tostring(expected),(resultexpected)and✓or✗))end原理简述32位无符号序号范围 04,294,967,295当达到最大值后归零。判断新旧的标准计算差值diff (a - b) mod 2^32结果落在 [0, 2^32)。若diff 2^31说明 a 在 b 之后新否则 a 在 b 之前旧。若diff 0表示相等。该算法利用“半个区间”规则在环形空间内确定前进方向。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2426320.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!