Re[3]: Посчитать биты занимаемые числом.
От: Павел Кузнецов  
Дата: 08.05.03 07:50
Оценка:
Здравствуйте, VladD2, Вы писали:

ПК>>
ПК>> template<unsigned n>
ПК>> struct NBits
ПК>> {
ПК>>  enum { value = NBits<(n >> 1)>::value + 1 };
ПК>> };

ПК>> template<>
ПК>> struct NBits<0>
ПК>> {
ПК>>  enum { value = 0 };
ПК>> };

ПК>> unsigned iBits = NBits<sizeof(array) / sizeof(array[0])>::value;
ПК>>


V> А зачем нужна специализация? Ну, "NBits<0>"? Это борьба с кем-то или

V> еще что?

Это "терминальное" значение для избежания бесконечной рекурсии.

V> принцип действия


Один в один перенос твоего кода, только выраженный через рекурсию времени компиляции.

Вот примерный ход вычисления NBits<13>::value

NBits<13>::value = NBits<(13 >> 1)>::value + 1
                 = NBits<6>::value         + 1
                 = NBits<(6 >> 1)>::value  + 1 + 1
                 = NBits<3>::value         + 1 + 1
                 = NBits<(3 >> 1)>::value  + 1 + 1 + 1
                 = NBits<1>::value         + 1 + 1 + 1
                 = NBits<(1 >> 1)>::value  + 1 + 1 + 1 + 1
                 = NBits<0>::value         + 1 + 1 + 1 + 1
                 = 0                       + 1 + 1 + 1 + 1
                 = 4;


Если бы не было специализации NBits<0>, рекурсия бы не закончилась.

V> Кстати, сработало даже в managed-C++.


Прикольно
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.