Магическое число в отраженном сером коде в двоичное преобразование

Я написал универсальную функцию для преобразования двоичного отраженного кода Грея в стандартный двоичный код. Я использовал алгоритм, который я нашел на эта страница. Вот вышеупомянутый алгоритм:

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 а не с любым другим коэффициентом.

Кто-нибудь знает, чему на самом деле соответствует это магическое число?

2

Решение

4 бывает 8 / 2 [цитата нужна], или CHAR_BIT / 2,

Алгоритм декодирования кода Грея начинается с того, что он берет левую половину заданного целочисленного типа и смещает его в правую половину типа. sizeof(type) * (CHAR_BIT / 2) биты вправо, это именно то, что вы видите.

Как указано в комментариях, std::numeric_limits<type>::digits / 2 было бы более идиоматическим решением для C ++.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]