Удалось обнаружить один нюанс в работе скрипта. Оказывается, lua в симуляторе по логике работы отличается от стандартного lua. Отличие проявляется в обработке больших чисел, я предполагаю, что lua в симуляторе использует 32-й бит для своих нужд, ограничивая таким образом максимальную длину числа в 31 бит.
Мнение это у меня появилось после наблюдений, как скрипт, запущенный на lua "из коробки" дал один результат (правильный), этот же скрипт, запущенный в симуляторе, выдал совершенно другой результат. Например, если сделать простое арифметическое действие (4294967295 - 3534543), мы в симуляторе получим 4291432704, тогда как правильный ответ - 4291432752. Такие ошибки проявляются постоянно, если обрабатываются большие числа.
Этот нюанс сказывается в том числе на работе распространенных в сети функций битовых операций. Они или виснут, или возвращают некорректный результат.
Если, все же, требуется выполнить битовые операции, я могу предложить, как альтернативу, набор более "жестких" функций, по сравнению с другими. Они могут уступать в быстродействии, но зато, по крайней мере, обрабатывают 32-разрядные числа без проблем и заточены именно под них.
- Код: Выделить всё
function To_Bin (num)
local temp, bin, i = 0, {}, 0
repeat
temp = num
num = math.floor(num / 2)
table.insert (bin, 1, (temp - num * 2) ~= 0 and "1" or "0")
i = i + 1
until num == 0
bin = string.rep("0", 32 - i)..table.concat(bin)
return bin
end
function BitXOR (a, b)
a = To_Bin (a)
b = To_Bin (b)
local res = {}
for i = 1, 32 do
table.insert (res, string.sub (a, i, i) == string.sub (b, i, i) and "0" or "1")
end
return tonumber (table.concat(res), 2)
end
function BitNOT (num)
num = To_Bin (num)
local res = {}
for i = 1, 32 do
table.insert (res, string.sub (num, i, i) == "1" and "0" or "1")
end
return tonumber (table.concat(res), 2)
end
function BitAND (a, b)
a = To_Bin (a)
b = To_Bin (b)
local res = {}
for i = 1, 32 do
table.insert (res, (string.sub (a, i, i) == "1" and string.sub (b, i, i) == "1") and "1" or "0")
end
return tonumber (table.concat(res), 2)
end
function BitOR (a, b)
a = To_Bin (a)
b = To_Bin (b)
local res = {}
for i = 1, 32 do
table.insert (res, (string.sub (a, i, i) == "1" or string.sub (b, i, i) == "1") and "1" or "0")
end
print (table.concat(res))
return tonumber (table.concat(res), 2)
end
function rshift (x, by)
return math.floor (x / 2 ^ by)
end
function lshift (x, by)
return x * 2 ^ by
end
Функции сдвига не мои, я их выкладываю просто для комплектности, так как конкретно эти функции поддерживаются симулятором.
Добавлено спустя 7 часов 20 минут 3 секунды:Также в симуляторном lua не работают функции
math.fmod (a, b) string.reverse (s). Теоретически функцию
math.fmod (a, b) можно заменить на
math.mod (a, b). У меня же успешно работают эти функции:
- Код: Выделить всё
function reverse (s)
local table_char = {}
for i = 1, string.len (s) do
table.insert (table_char, 1, string.sub (s, i, i))
end
return table.concat(table_char)
end
function mod (a, b)
return a - (math.floor(a/b)*b)
end