Не в простом Lua. Конечно, вы можете оптимизировать экспоненциация и если-заявление прочь письма:
local MAXINT, SUBT = math.pow(2, 31), math.pow(2, 32)
function convert(n)
-- Like C's ternary operator
return (n >= MAXINT and n - SUBT) or n
end
Я не знаю, если оптимизировать заявление, если одноразовым будет много помощи переводчику; не для LuaJIT, я думаю; но, вероятно, для простого Луа?
Если вы действительно хотите избежать сравнения, перейдите на C, например. (непроверенный код!):
int convert(lua_State *L)
{
lua_pushinteger(L, (int) ((unsigned int) luaL_checklong(L, 1)));
return 1;
}
Однако накладные расходы на стеке, вероятно, победят цель.
Любые конкретные причины для микро-оптимизации?
Edit: Я думал об этом, и это на самом деле возможно в простом Lua:
local DIV, SUBT = math.pow(2, 31) + 1, math.pow(2, 32)
-- n MUST be an integer!
function convert(n)
-- the math.floor() evaluates to 0 for integers 0 through 2^31;
-- else it is 1 and SUBT is subtracted.
return n - (math.floor(n/DIV) * SUBT)
end
Я не уверен, будет ли это повысить производительность; разделение должно быть быстрее, чем условный скачок. Технически, однако, это отвечает на вопрос и позволяет избежать сравнения.
Микро-оптимизация в лучшем виде. –