«Самое справедливое» линейное масштабирование фактически выполняется так:
floor(256 * value / (Integer.MAX_VALUE + 1))
Обратите внимание, что это просто псевдокод и предполагает вычисления с плавающей запятой.
Если мы предположим, что Integer.MAX_VALUE + 1 равно 2 ^ 31, и что / даст нам целочисленное деление, то оно упрощается до
value / 8388608
Почему другие ответы неверны
В некоторых ответах (а также в самом вопросе) предлагается вариант (255 * value / Integer.MAX_VALUE)
. Предположительно это должно быть преобразовано в целое число, используя round()
или floor()
.
При использовании floor()
единственное value
, которое выдает 255, - это само Integer.MAX_VALUE. Это распределение неравномерно.
Если использовать round()
, 0 и 255 будут поражены вдвое больше, чем 1-254. Также неравномерно.
При использовании метода масштабирования, о котором я упоминал выше, такой проблемы не возникает.
Нелинейные методы
Если вы хотите использовать логи, попробуйте это:
255 * log(value + 1) / log(Integer.MAX_VALUE + 1)
Вы также можете просто взять квадратный корень из значения (это не дойдет до 255, но вы можете увеличить его, если хотите).