У меня есть ощущение, что к этому есть чисто математический подход, но я не могу разобраться в этом. В противном случае наиболее эффективный способ сделать это - использовать цикл и некоторые побитовые сравнения:
public static byte Evaluate(ulong n) {
ulong mask = 0xFF;
byte result = 0;
for (int i = 0; i < 8; i++) {
if ((n & (mask << (i * 8))) != 0) {
result |= (byte)(1 << i);
}
}
return result;
}
Маска - это предварительно сконфигурированное значение, где каждый бит в одном байте равен 1 (255 в десятичном виде, FF в шестнадцатеричном). Вы смещаете маску на i * 8
, чтобы она покрывала n-й байт ввода, а затем используете побитовое И для получения значения этого байта. Все, что вам нужно сделать, это проверить, не является ли это значение байта ненулевым, и если это так, установить соответствующий бит результирующего байта равным 1. (Это можно сделать с помощью сложения или побитового ИЛИ, поэтому я выбрал идти по маршруту ИЛИ, чтобы придерживаться побитовой темы.)
https://dotnetfiddle.net/EA7NRw