Я пока не могу комментировать, недостаточно повторений, но Лиор смешивает Java с C # в очень неправильном ответе.
байт в C # является байтом без знака, который является полной противоположностью всем другим типам целых чисел в C #, которые подписаны по умолчанию.
Часть 0xFF совершенно бессмысленна, потому что даже если байт был подписан, например, 0xFE равно -2. Например, использование поразрядно-и с 0xFE и 0xFF не остановит отрицательный результат 0xFE. 0x7F будет.
Что касается главного ответа, я вполне уверен, что эти микрооптимизации могут помочь, хотя они и являются микрооптимизациями, которые, вероятно, не будут иметь никакого реального значения, потому что JIT-компилятор может просто сделать что-то еще, и потому что компьютеры просто слишком быстро.
chars[2 * i + 2] = ToHexDigit(bytes[i] / 16);
chars[2 * i + 3] = ToHexDigit(bytes[i] % 16);
Небольшое изменение, чтобы использовать битовый сдвиг и битовые операции вместо делителя и по модулю.
chars[2 * i + 2] = ToHexDigit((bytes[i] >> 4) & 0xF);
chars[2 * i + 3] = ToHexDigit(bytes[i] & 0xF);
Это другая «оптимизация», хотя я считаю ее более читаемой. Может быть, это потому, что я знаю большую часть таблицы ASCII наизусть.
private static char ToHexDigit(int i)
{
return (char)(i + (i < 10 ? 48 : 55));
}
Если вы пытаетесь получить гекс в нижнем регистре (без ToLower), просто поменяйте местами 55 на 87. Это очень просто.
Обновление: похоже, что Лиор или кто-то удалил его совсем не отвечающий. Это был хороший ход.