Я написал универсальную функцию для преобразования двоичного отраженного кода Грея в стандартный двоичный код. Я использовал алгоритм, который я нашел на эта страница. Вот вышеупомянутый алгоритм:
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
а не с любым другим коэффициентом.
Кто-нибудь знает, чему на самом деле соответствует это магическое число?
4
бывает 8 / 2
[цитата нужна], или CHAR_BIT / 2
,
Алгоритм декодирования кода Грея начинается с того, что он берет левую половину заданного целочисленного типа и смещает его в правую половину типа. sizeof(type) * (CHAR_BIT / 2)
биты вправо, это именно то, что вы видите.
Как указано в комментариях, std::numeric_limits<type>::digits / 2
было бы более идиоматическим решением для C ++.
Других решений пока нет …