Преобразование десятичного числа в значения флага

У меня есть некоторые ограничения, например:

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

Как мне из десятичной определить флаги?


person Col_Blimp    schedule 17.02.2014    source источник


Ответы (1)


Чтобы определить, какие флаги были установлены, необходимо использовать операцию побитовое И (< a href="http://www.lua.org/manual/5.2/manual.html#pdf-bit32.band" rel="nofollow">bit32.band() в Lua 5.2). Например:

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
person Tim Cooper    schedule 17.02.2014
comment
В Lua 5.1 или LuaJIT бит32 недоступен, но вместо него вы можете использовать luabitop. Он изначально поставляется с LuaJIT, вам нужно установить его для 5.1. - person catwell; 18.02.2014
comment
Существует обратный порт bit32 на Lua 5.1 (raw.github.com/hishamhm/lua-compat-5.2/bitlib-5.2.2/lbitlib.c). Он существует в LuaRocks и LuaDist. А у LuaJIT есть своя битовая библиотека - person moteus; 18.02.2014