Как уже упоминалось, количество битов, необходимых для представления числа в базе два, можно рассчитать с помощью логарифмов. Например, следующий код на Erlang.
bits(0) ->
1;
bits(X) when is_number(X), X < 0 ->
1 + bits(erlang:abs(X));
bits(X) when is_number(X) ->
erlang:trunc(math:log(X) / math:log(2) + 1).
Если вас интересуют только размеры слов 1,2 и 4, то, конечно, приятно проверить только несколько ограничений. Мне нравится использовать базу 16 для пределов, используя радикальную нотацию Эрланга.
unsigned_wordsize(X) when is_integer(X), X >= 0 ->
case X of
_ when X =< 16#000000ff -> 1;
_ when X =< 16#0000ffff -> 2;
_ when X =< 16#ffffffff -> 4
end.
И я предполагаю из вашего кода, что вы используете два дополнения для целых чисел со знаком. Поэтому я сопоставляю отрицательные числа положительным, чтобы я мог использовать ту же таблицу.
signed_wordsize(X) when is_integer(X), X < 0 ->
signed_wordsize(-(X+1));
signed_wordsize(X) when is_integer(X) ->
case X of
_ when X =< 16#0000007f -> 1;
_ when X =< 16#00007fff -> 2;
_ when X =< 16#7fffffff -> 4
end.