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

2023-12-02

我在 Redis 上使用 Lua,想要比较两个有符号的 64 位数字,它们存储在两个 8 字节/字符的字符串中。

如何使用 Redis 中可用的库来比较它们?http://redis.io/commands/EVAL#available-libraries

我想知道>/< and ==检查。我认为这可能涉及为每个 64 位 int 提取两个 32 位数字,并对这些数字进行一些巧妙的数学计算,但我不确定。

我有一些代码可以让这个变得不那么抽象。a0, a1, b0, b1都是 32 位数字,用于表示两个 64 位有符号 int 64 的 MSB 和 LSB:

-- ...
local comp_int64s = function (a0, a1, b0, b1)
    local cmpres = 0
    -- TOOD: Real comparison
    return cmpres
end
local l, a0, a1, b0, b1
a0, l = bit.tobit(struct.unpack("I4", ARGV[1]))
a1, l = bit.tobit(struct.unpack("I4", ARGV[1], 5))
b0, l = bit.tobit(struct.unpack("I4", blob))
b1, l = bit.tobit(struct.unpack("I4", blob, 5))
print("Cmp result", comp_int64s(a0, a1, b0, b1))

编辑:添加代码


我想出了一个看起来有效的方法。虽然有点丑。

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

-1  —> -1
0 —> 0
9223372036854775807 = 0x7fff ffff ffff ffff -> 0x7ffff ffff = 2147483647

因此,除非它们相等,否则从 MSB 的工作返回结果,然后需要检查 LSB。

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

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

And

8589934591 = 0x0000 0001 ffff ffff
8589934590 = 0x0000 0001 ffff fffe
32 bit is:
8589934591 -> ffff ffff = -1
8589934590 -> ffff fffe = -2
8589934591 > 8589934590 would be -1 > -2 : GOOD

MSB 上的符号位并不重要,因为负数与正数之间具有相同的关系。例如,无论符号位如何,LSB 值0xff > 0xfe, 总是。

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

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

所以我们需要忽略低32位的符号位。由于无论符号如何,LSB 的关系都是相同的,因此只需使用 最低 32 位无符号适用于所有情况。

这意味着我想对 MSB 进行签名,对 LSB 进行未签名 - 所以 chagingI4 to i4对于LSB。还使大端正式并在 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
    end
end
local l, as0, au1, bs0, bu1
as0, 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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Lua 中使用 32 位按位运算比较有符号的 64 位数字 的相关文章

  • 在 sidekiq 上配置 redis 身份验证

    我想我错过了一些东西 因为我在文档中找不到如何编写 redis 实例的用户名和密码以与 sidekiq 一起使用 有没有办法做到这一点 或者是通过 ENV 变量 Sidekiq 将无法识别的 Redis 选项直接传递给 Redis 驱动程序
  • 在lua中组合两个函数

    我刚开始学习lua 所以我的要求可能是不可能的 现在 我有一个接受函数的方法 function adjust focused window fn local win window focusedwindow local winframe w
  • socket.io 广播功能 & Redis pub/sub 架构

    如果有人能帮助我解决一个小疑问 我将不胜感激 使用socket io广播功能和在Redis上使用pub sub设计架构有什么区别 例如 在另一个示例中 node js 服务器正在侦听 socket io 针对 键 模型 todo 和值 数据
  • 去掉尾随零和小数点

    使用 Lua 我将数字格式化为可变位数并去掉尾随零 小数点 例如 string format precision f value gsub 0 1 gsub 值的类型为数字 正数 负数 整数 小数 所以任务已经解决了 但出于美学 教育和性能
  • 如何在Redis中进行持久化存储?

    关闭redis服务器后 使用set存储的值被破坏 在这里我找到了使用持久性存储的方法 有人帮助我 如何使用javascript实现这一点 我想将客户端的一些值存储在 redis 数据库中 并且必须在其他客户端中使用该值 您需要配置 Redi
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • 为什么 Redis TimeSeries 不捕获聚合中的最后一个元素?

    我试图了解 Redis 的时间序列规则创建的工作原理 但我很困惑为什么 Redis 会忽略聚合中的最后一项 并想知道这是否是预期的行为 我在中创建了示例代码redis cli为了显示 127 0 0 1 6379 gt FLUSHALL O
  • Lua 将字符串转换为数字 - 取决于语言环境

    刚刚注意到字符串 and tonumber 在 Lua 中是依赖于语言环境的 知道如何在不使用的情况下将字符串转换为数字tonumber 谢谢 例如将字符串 58 5 转换为 58 5 另外 当我尝试将带点的数字传递给函数时 该函数会转换
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • StackExchange.Redis的正确使用方法

    这个想法是使用更少的连接和更好的性能 连接会随时过期吗 对于另一个问题 redis GetDatabase 打开新连接 private static ConnectionMultiplexer redis private static ID
  • redis dump.rdb / 保存小文件

    Context 我正在使用redis 数据库小于 100 MB 但是 我想进行每日备份 我也在 Ubuntu Server 12 04 上运行 当输入 redis cli save 我不知道 dump rdb 保存到哪里 因为 redis
  • 如何终止Lua脚本?

    如何终止 Lua 脚本 现在我在 exit 方面遇到问题 我不知道为什么 这更像是一个 Minecraft ComputerCraft 问题 因为它使用了包含的 API 这是我的代码 while true do if turtle dete
  • 如何让我的 add 命令找到第一个变量和第二个变量的值,然后将它们加在一起?

    vars values function open file lex file end function lex file local data io open file r for char in data lines do Print
  • 如何在Redis中只保存一个数据库?

    我是 Redis 新手 有一个与备份相关的问题 目前 我有一个实例在 Windows 服务器上运行 在这个实例中 我当前有一项 工作 将数据存储在一个数据库中 我不想备份这些数据 我必须创造一份新工作 我的第一个想法是将数据存储在另一个数据
  • Lua中有状态迭代器和无状态迭代器的区别

    Lua中无状态和有状态迭代器有什么区别 请详细解释一下 什么时候需要使用无状态 什么时候需要使用另一种 我需要例子来理解这个概念 首先让我们就一个定义达成一致 在 Lua 中 迭代器是function 类似对象 每次调用时都会返回序列中的下
  • Lua 上的 For 循环

    我的作业是如何执行 for 循环 我已经从数字上弄清楚了 但无法从名称上弄清楚 我想创建一个 for 循环来运行名称列表 以下是我到目前为止所拥有的 names John Joe Steve for names 1 3 do print n
  • Spring Redis 排序键

    我在 Redis Spring Data Redis 中有以下键 localhost gt Keys 1 id 1 Name C5796 Site DRG1 2 id 2 Name CX1XE Site DG1 3 id 3 Name C5
  • Laravel Redis 配置

    我目前正在使用 Laravel 和 Redis 创建一个应用程序 几乎一切都工作正常 我按照文档中的说明扩展了身份验证 用户可以订阅 登录 注销 我可以创建内容 所有内容都存储在 Redis 中 但我有一个问题 我无法运行 php arti
  • 在 lua 中加载 C++ 模块时出现“尝试索引字符串值”错误

    我正在尝试使用 lua 用 C 编写的函数 下面给出的是cpp文件 extern C include lua h include lauxlib h include lualib h static int add 5 lua State L
  • ServiceStack.Redis:无法连接:sPort:

    我经常得到 ServiceStack Redis 无法连接 sPort 0 或 ServiceStack Redis 无法连接 sPort 50071 或其他端口号 当我们的网站比较繁忙时 就会出现这种情况 Redis 本身看起来很好 CP

随机推荐

  • Cygwin bash shell 中的 For 循环,后跟“">”

    当我在 cygwin bash shell 中键入以下命令时 for i in ls do echo i done 我收到一个 gt 要求我继续输入 这与预期的行为相反 为什么 你需要将 for do 和 did 语句分开 试试这个 for
  • python中的零填充右移

    function e t return e lt lt t e gt gt gt 32 t 我在js中有这个方法 我对移位操作不太了解 我想用 python 写这个 我如何在 python 中编写等效代码 因为它不支持JS 中的零填充右移运
  • 使用具有非标准端口的远程存储库

    我正在为远程存储库设置本地 git 项目 远程存储库正在非标准端口 4019 上提供服务 但这不起作用 相反 我收到以下错误消息 ssh connect to host git host de 4019 port 22 Connection
  • Whatsapp 和 Viber 使用哪些机制进行聊天和消息传递

    我正在搜索有关 Whatsapp 和 Viber 的一些信息 他们通过 VOIP 提供免费通话 短信和聊天功能 任何人都可以确定这两个应用程序使用哪种机制 意味着聊天使用了哪种协议以及其他详细信息 以及任何其他可能有助于创建此类聊天应用程序
  • 更改带有选项卡的接受按钮

    我有一个用 C 编写的 Windows 窗体应用程序 它有三个选项卡 我希望接受按钮随活动选项卡一起更改 就像当我在选项卡 1 中时 我希望按钮 1 成为接受按钮 但当我在选项卡 3 中时 我希望按钮 3 成为我的接受按钮 我不知道如何做到
  • 如何为networkD3的sankeyNetwork中的组着色?

    我的节点由名称和组组成 但我似乎无法在桑基图中为组实现不同的颜色 默认颜色为全蓝色 或者使用下面的代码为全黑色 这是我使用的代码 sankeyNetwork Links data links Nodes data nodes Source
  • Android Java UTF-8 JSON

    我的应用程序的一部分在 mysql 数据库上执行查询 通过 php 我在数据库中使用 UTF 8 因为我有像 这样的字母需要出现 我通读了这个问题 因为这看起来几乎是一样的 Android Java UTF 8 HttpClient 问题
  • RMarkdown 自动锚定部分

    嗯 我使用 Markdown 已经一年了 今天突然在标题旁边自动添加了一个 a 标签 有人会知道为什么这些锚点是自动生成的以及我如何删除它们 Pd 解决这个问题的一种方法是使用h1 h2等 但是随着pdf输出 索引被消除 所以它并不能真正解
  • 检查字符串中是否包含对象值的任何部分

    我有一个看起来像这样的字符串 link to page foo bar test 1 另外我有一个看起来像这样的对象 key foo bar test false mock data 我想要实现的事情相当简单 我认为 但也许我在这里错过了显
  • 在 IIS 7.5 中部署 MVC3 - 不断收到 CS1009: 无法识别的转义序列错误消息

    我不断得到 Line 43 public override void Execute Line 44 WriteLiteral Line 45 Line 46 Source File c Windows Microsoft NET Fram
  • 如何在 Spring 中使用列表作为模型属性?

    我的家庭控制器是这样的 RequestMapping public ModelAndView welcome ModelAttribute myValuesInRows List
  • FolderItem.InvokeVerb("Delete") 无需确认

    我正在尝试编写一个工具 该工具将自动存档服务器上的旧日志文件并从存档中删除太旧的文件 并且有问题 我需要使用 powershell 从 ZIP 存档中删除单个文件 所以我这样做 testFile C test logs FirstEntry
  • Avaje - EBean - 部分对象查询禁用延迟加载

    我正在使用 Play 开发一个应用程序 框架 2 1 3 使用 EBean 作为模型层我希望能够执行部分对象查询 并且当我序列化为 JSON 准备将结果发送回用户时 不要按需延迟加载未选择的属性 我尝试将 AutoFetch 设置为 fal
  • 无法在 Rmarkdown 报告中生成交互式绘图

    我有一个 Rmarkdown 文档 其中包含用plotly绘制的图 并且想生成一个html文件 当我点击时它起作用编织为 HTML在 Rstudio 中 但当我在命令行上运行以下命令时则不然 Rscript e require knitr
  • 为什么这个 Less 表达式根据数学运算而成为语法错误?

    我有以下 Less 片段 Foo 50px someClass width calc 100 Foo 5px 这很好用 但是 如果我将其更改为 Foo 50px someClass width calc 100 Foo 5px 我们现在有一
  • 如何测试是否已获得管理员同意

    我们正在开发一个 Office 加载项 可使用 Azure AD 的组织帐户进行身份验证 该加载项需要管理同意 因此 如果管理员登录 应引导他表达管理同意 我们使用 OAuth 进行身份验证 https login microsoftonl
  • Mysql事务:提交和回滚

    我将 PhpMyAdmin 数据库引擎从 MyISAM 更新为 INNODB 以允许回滚 这是我的 SQL 查询 START TRANSACTION UPDATE jkm content SET state 0 WHERE title IN
  • 在 Android 中动态加载 .dex 文件时出现“ClassNotFound”异常

    我正在尝试学习在 Android 中动态加载类 dex jar 我从教程和 Stack Overflow 问题中收集了基本想法 tutorial this and this 但我未能实现动态加载类文件并不断给出的目的ClassNotFoun
  • 我应该设置什么 COLLATE 才能使用所有可能的语言?

    我有一个专栏叫username 我希望用户能够插入日语 罗马语 阿拉伯语 韩语以及所有可能的文本 包括特殊字符 https en wiktionary org wiki Index All languages what COLLATE我应该
  • 在 Lua 中使用 32 位按位运算比较有符号的 64 位数字

    我在 Redis 上使用 Lua 想要比较两个有符号的 64 位数字 它们存储在两个 8 字节 字符的字符串中 如何使用 Redis 中可用的库来比较它们 http redis io commands EVAL available libr