将十进制数转换为标志值

Posted

技术标签:

【中文标题】将十进制数转换为标志值【英文标题】:Converting decimal number to flag values 【发布时间】:2014-02-17 22:49:16 【问题描述】:

我有一些这样的限制:

interesting = 0x1
choked = 0x2
remote_interested = 0x4
remote_choked = 0x8
supports_extensions = 0x10
local_connection = 0x20
handshake = 0x40
connecting = 0x80
queued = 0x100
on_parole = 0x200
seed = 0x400
optimistic_unchoke = 0x800
rc4_encrypted = 0x100000
plaintext_encrypted = 0x200000

文档告诉我 'flags 属性告诉你对等体处于哪个状态。它设置为上面枚举的任意组合'所以基本上我调用 dll 并填写用十进制数表示标志值的结构,几个例子:

2086227
170
2098227
106

我如何从十进制中确定标志?

【问题讨论】:

【参考方案1】:

为了确定设置了哪些标志,您需要使用bitwise AND 操作(Lua 5.2 中的bit32.band())。例如:

function hasFlags(int, ...)
    local all = bit32.bor(...)
    return bit32.band(int, all) == all
end

if hasFlags(2086227, interesting, local_connection) then
    -- do something that has interesting and local_connection
end

【讨论】:

在 Lua 5.1 或 LuaJIT 中,bit32 不可用,但您可以使用 luabitop 代替。它自带 LuaJIT,你需要为 5.1 安装它。 存在 bit32 到 Lua 5.1 (raw.github.com/hishamhm/lua-compat-5.2/bitlib-5.2.2/lbitlib.c) 的反向端口。它存在于 LuaRocks 和 LuaDist 中。而且LuaJIT有自己的位库

以上是关于将十进制数转换为标志值的主要内容,如果未能解决你的问题,请参考以下文章

Javascript如何将十进制数转换为具有特定小数位数的字符串

SwiftUI中如何将带逗号的十进制数转换为小数(Point)?

求c语言将十进制数转换为16进制的函数

给定一个十进制数M,以及需要转换的进制数N。 将十进制数M转化为N进制数

数字逻辑8421BCD码换成十进制和二进制数

将十六进制数转换为十进制数