...Увидел в Q&A статью г-на Шаргина (http://www.rsdn.ru/qna/?Cpp/bin.xml)
про двоичные константы, и пробило меня написать этот в меру бесполезный,
но прикольный опус.
Итак, использование:
cout <<"0x"<< hex << Ob<10101010>::value << endl;
//на выходе получаем "0xaa" - вроде бы правильно :-)
//раскоментарь чтобы увидеть как компилятор ругается на неверные двоичные числа
//cout <<"0x"<< hex << Ob<1234>::value << endl
И, собственно, сам код:
//генератор ошибок для неверных двоичных чиселtemplate<int> struct BAD_BINARY_NUMBER;
template<> struct BAD_BINARY_NUMBER<0> {};
template<> struct BAD_BINARY_NUMBER<1> {};
//Собственно, сам двоичный конверторtemplate<unsigned V> struct Ob
{
BAD_BINARY_NUMBER<(V%10)> check;
enum { value = (V%10) + (Ob<(V/10)>::value << 1) };
};
template<> struct Ob<0>
{
enum { value = 0 };
};
Проверено и работает на компиляторах:
— Visual C++ 6.0, 7.0, 7.1
— GCC 3.2.2
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
...попробовал я свое творение на сжатие и разрыв, и внес следующие дополнения:
— ограничение на длину "двоичного числа" до 8 символов (1 байт) — а то на слишком длинную константу компилеры обижаются
— добавил шаблоны Ob2 (для 2-байтного целого) и Ob4(для 4-байтного)
Обнаружился весьма серьезный функциональный прогиб связанный с восьмеричной нотацией.
Дело в том что число "10101010" — десятичное, а число начинающееся с нуля "010101010" — уже восьмеричное! Естественно, это обгадило всю малину.
Так что, багфикс.
Все фичи заявленные в предыдущих релизах сохранены.
Здравствуйте, _nn_, Вы писали:
N>Применение union...
Ты немного не просек в чем соль...
А соль в том что мое "двоичное" не порождает никакого кода (в отличие от твоего) — все расчеты выполняются на этапе компиляции — в исполнимый код идет только готовое число.
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.