Я написал общую функцию для преобразования двоичного отраженного кода Грея в стандартный двоичный код. Я использовал алгоритм, найденный на этой странице. Вот вышеупомянутый алгоритм:
unsigned short grayToBinary(unsigned short num)
{
unsigned short temp = num ^ (num>>8);
temp ^= (temp>>4);
temp ^= (temp>>2);
temp ^= (temp>>1);
return temp;
}
Затем я изменил код, чтобы он работал для любого стандартного типа unsigned
. Вот что я написал:
template<typename Uint>
Uint grayToBinary(Uint value)
{
for (Uint mask = sizeof(Uint)*4 ; mask ; mask >>= 1)
{
value ^= value >> mask;
}
return value;
}
Алгоритм, кажется, отлично работает для каждого unsigned
стандартного типа. Однако при его написании я инстинктивно использовал sizeof(Uint)*4
, так как имело смысл, что конечное условие будет зависеть от размера шрифта, но правда в том, что я понятия не имею, что на самом деле представляет sizeof(Uint)*4
. Пока это магическое число, которое я написал инстинктивно, но я не могу объяснить, почему оно работает с *4
, а не с каким-либо другим коэффициентом.
Кто-нибудь знает, чему на самом деле соответствует это магическое число?