2014-02-17 6 views
1

У меня есть некоторые ограничения, например, так:.Преобразования десятичного числа флага значение

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 

и документация говорит мне атрибут флаги говорит вам, в каком состоянии равноправный в нем установлен в любую комбинацию перечисления выше» поэтому в основном я называю DLL и заполняет структуру с десятичным числом, представляющим значение флагов, несколько примеров:

2086227 
170 
2098227 
106 

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

ответ

4

Для определения того, какие флаги были установлены, вам необходимо использовать операцию bitwise AND (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 
+4

В Lua 5.1 или LuaJIT бит32 недоступен, но вместо этого вы можете использовать luabitop. Он поставляется с LuaJIT, вам нужно установить его на 5.1. – catwell

+1

Существует обратный порт 'бит32' в Lua 5.1 (https://raw.github.com/hishamhm/lua-compat-5.2/bitlib-5.2.2/lbitlib.c). Он существует в LuaRocks и LuaDist. И LuaJIT имеет собственную библиотеку бит – moteus

Смежные вопросы