栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Lua中的32位按位运算比较带符号的64位数字

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Lua中的32位按位运算比较带符号的64位数字

我想出了一种看起来可行的方法。虽然有点丑陋。

第一步是比较前32位,因为2个补码#的MSB符号位保持不变,因此数字保持正确的关系

-1  —> -10 —> 09223372036854775807 = 0x7fff ffff ffff ffff -> 0x7ffff ffff = 2147483647

因此,除非MSB的工作结果相等,否则从MSB的工作中返回结果,则需要对LSB进行检查。

我有几个案例来建立一些模式:

-1 = 0xffff ffff ffff ffff-2 = 0xffff ffff ffff fffe32 bit is:-1 -> 0xffff ffff = -1-2 -> 0xffff fffe = -2-1 > -2 would be like -1 > -2 : GOOD

8589934591 = 0x0000 0001 ffff ffff8589934590 = 0x0000 0001 ffff fffe32 bit is:8589934591 -> ffff ffff = -18589934590 -> ffff fffe = -28589934591 > 8589934590 would be -1 > -2 : GOOD

MSB的符号位无所谓b / c负数之间的关系与正数相同。例如,无论符号位如何,lsb值始终为

0xff
>
0xfe

如果低32位的MSB不同怎么办?

0xff7f ffff 7fff ffff = -36,028,799,166,447,6170xff7f ffff ffff ffff = -36,028,797,018,963,96932 bit is:-..799.. -> 0x7fff ffff = 2147483647-..797.. -> 0xffff ffff = -1-..799.. < -..797.. would be 2147483647 < -1 : BAD!

因此,我们需要忽略低32位的符号位。而且,由于LSB的关系与符号无关,因此它们相同,因此在所有情况下仅使用最低的32位无符号即可。

这意味着我要为MSB的符号和无符号对于LSB -所以换款

I4
i4
对于LSB。也使big
endian成为正式文件,并在struct.unpack调用上使用“>”:

-- ...local comp_int64s = function (as0, au1, bs0, bu1)    if as0 > bs0 then        return 1    elseif as0 < bs0 then        return -1    else        -- msb's equal comparing lsbs - these are unsigned        if au1 > bu1 then return 1        elseif au1 < bu1 then return -1        else return 0        end    endendlocal l, as0, au1, bs0, bu1as0, l = bit.tobit(struct.unpack(">i4", ARGV[1]))au1, l = bit.tobit(struct.unpack(">I4", ARGV[1], 5))bs0, l = bit.tobit(struct.unpack(">i4", blob))bu1, l = bit.tobit(struct.unpack(">I4", blob, 5))print("Cmp result", comp_int64s(as0, au1, bs0, bu1))


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370396.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号