Побитовые операции Lua 5.1 с использованием арифметики для 64-битных чисел ⇐ C++
Побитовые операции Lua 5.1 с использованием арифметики для 64-битных чисел
Lua 5.1 пока не поддерживает побитовые операторы. Среда Lua, которую я использую, ограничена и предоставляет библиотеку bit32, которая позволяет выполнять побитовые операции с 32-битными числами.
Проблема в том, что я пытаюсь перенести алгоритм, написанный на Lua 5.4 (poly1305), который вы можете найти здесь: https://github.com/philanc/plc/blob/mas ... ly1305.lua И этот алгоритм использует числа размером более 32 бит, что делает результат неверным в моей среде.
Вы можете найти мой бэкпорт поли1305 https://pastebin.com/mfNhDqvw
Я провел небольшое исследование по выполнению побитовых операций с использованием арифметики и нашел функциональные оболочки, но они не работают с числами длиной более 32 бит. Сможет ли кто-нибудь из вас заставить их работать с 64-битными числами или при необходимости полностью переписать их?
local MOD = 2 ^ 32 локальный МОДМ = МОД - 1 локальная функция memoize(f) местный мт = { } локальный т = setmetatable( { }, мт) функция mt:__index(k) локальный v = f(k) т[к] = v вернуть v конец вернуть т конец локальная функция make_bitop_uncached(t, m) локальная функция bitop(a, b) местный ресурс, р = 0, 1 в то время как a ~= 0 и b ~= 0 делают местное am, bm = a % m, b % m рез = рез + t[am][bm] * p а =(а - ам)/м б = (б - бм)/м р = р * м конец рез = рез +(а + б) * р вернуть разрешение конец вернуть битоп конец локальная функция make_bitop(t) локальный op1 = make_bitop_uncached(t, 2 ^ 1) local op2 = memoize(функция(a) возвращает memoize(функция(b) возвращает op1(a, b) end) end) return make_bitop_uncached(op2, 2 ^(t.n или 1)) конец local bxor1 = make_bitop( { [0] = { [0] = 0, [1] = 1 }, [1] = { [0] = 1, [1] = 0 }, n = 4 }) локальная функция bxor(a, b, c, ...) локальный z = ноль если б, то а = % MOD б = б % MOD z = bxor1(а, б) если c, то z = bxor(z, c, ...) end вернуть z иначе, если тогда вернуть % MOD еще вернуть 0 конец конец полоса локальных функций (a, b, c, ...) местный г если б, то а = % MOD б = б % MOD z =((a + b) - bxor1(a, b)) / 2 если c, то z = bit32_band(z, c, ...) end вернуть z иначе, если тогда вернуть % MOD еще вернуть МОДМ конец конец локальная функция bnot(x) return(-1 - x) % MOD end локальная функция rshift1(a, disp) если disp < 0, то вернуть lshift(a, - disp) end return math.floor(a % 2 ^ 32/2 ^ disp) конец локальная функция rshift(x, disp) если disp > 31 или disp < -31, то вернуть 0 end вернуть rshift1(x % MOD, disp) конец локальная функция lshift(a, disp) если disp < 0, то вернуть rshift(a, - disp) end return(a * 2 ^ disp) % 2 ^ 32 конец локальная функция rrotate(x, disp) х = х % MOD дисп = дисп % 32 локальный минимум = полоса (x, 2 ^ disp - 1) вернуть rshift(x, disp) + lshift(low, 32 - disp) конец
Lua 5.1 пока не поддерживает побитовые операторы. Среда Lua, которую я использую, ограничена и предоставляет библиотеку bit32, которая позволяет выполнять побитовые операции с 32-битными числами.
Проблема в том, что я пытаюсь перенести алгоритм, написанный на Lua 5.4 (poly1305), который вы можете найти здесь: https://github.com/philanc/plc/blob/mas ... ly1305.lua И этот алгоритм использует числа размером более 32 бит, что делает результат неверным в моей среде.
Вы можете найти мой бэкпорт поли1305 https://pastebin.com/mfNhDqvw
Я провел небольшое исследование по выполнению побитовых операций с использованием арифметики и нашел функциональные оболочки, но они не работают с числами длиной более 32 бит. Сможет ли кто-нибудь из вас заставить их работать с 64-битными числами или при необходимости полностью переписать их?
local MOD = 2 ^ 32 локальный МОДМ = МОД - 1 локальная функция memoize(f) местный мт = { } локальный т = setmetatable( { }, мт) функция mt:__index(k) локальный v = f(k) т[к] = v вернуть v конец вернуть т конец локальная функция make_bitop_uncached(t, m) локальная функция bitop(a, b) местный ресурс, р = 0, 1 в то время как a ~= 0 и b ~= 0 делают местное am, bm = a % m, b % m рез = рез + t[am][bm] * p а =(а - ам)/м б = (б - бм)/м р = р * м конец рез = рез +(а + б) * р вернуть разрешение конец вернуть битоп конец локальная функция make_bitop(t) локальный op1 = make_bitop_uncached(t, 2 ^ 1) local op2 = memoize(функция(a) возвращает memoize(функция(b) возвращает op1(a, b) end) end) return make_bitop_uncached(op2, 2 ^(t.n или 1)) конец local bxor1 = make_bitop( { [0] = { [0] = 0, [1] = 1 }, [1] = { [0] = 1, [1] = 0 }, n = 4 }) локальная функция bxor(a, b, c, ...) локальный z = ноль если б, то а = % MOD б = б % MOD z = bxor1(а, б) если c, то z = bxor(z, c, ...) end вернуть z иначе, если тогда вернуть % MOD еще вернуть 0 конец конец полоса локальных функций (a, b, c, ...) местный г если б, то а = % MOD б = б % MOD z =((a + b) - bxor1(a, b)) / 2 если c, то z = bit32_band(z, c, ...) end вернуть z иначе, если тогда вернуть % MOD еще вернуть МОДМ конец конец локальная функция bnot(x) return(-1 - x) % MOD end локальная функция rshift1(a, disp) если disp < 0, то вернуть lshift(a, - disp) end return math.floor(a % 2 ^ 32/2 ^ disp) конец локальная функция rshift(x, disp) если disp > 31 или disp < -31, то вернуть 0 end вернуть rshift1(x % MOD, disp) конец локальная функция lshift(a, disp) если disp < 0, то вернуть rshift(a, - disp) end return(a * 2 ^ disp) % 2 ^ 32 конец локальная функция rrotate(x, disp) х = х % MOD дисп = дисп % 32 локальный минимум = полоса (x, 2 ^ disp - 1) вернуть rshift(x, disp) + lshift(low, 32 - disp) конец
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему заполнение структуры одинакова в 64 -битных и 32 -битных системах?
Anonymous » » в форуме C++ - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-