Инициализация переменных двоичным числом - C (СИ)
Формулировка задачи:
Возник такой вопрос.
Как известно: a - десятичное число, b - восьмеричное, c - шестнадцатиричное.
А каким образом можно инициализировать переменную двоичным числом и числом в какой-нибудь иной системе счисления?
int a = 10;
int b = 010;
int c = 0x10;
Решение задачи: «Инициализация переменных двоичным числом»
textual
Листинг программы
template<unsigned long N>
struct Byte {
enum{value = (N % 10) | (2 * Byte<N/10 >::value)};
};
template <>
struct Byte<0> {
enum {value = 0};
};
template <unsigned long Byte1, unsigned long Byte2>
struct Word {
enum{value = (Byte<Byte1>::value<<8) | Byte<Byte2>::value};
};
template<unsigned long Byte1, unsigned long Byte2, unsigned long Byte3, unsigned long Byte4>
struct Dword {
enum{value = (Word<Byte1, Byte2>::value <<16) | Word<Byte3, Byte4>::value};
};
void Foo() // Пример использования
{
std::cout << Word<1010101, 10101010>::value << std::endl; // Начинать число с ноликов нельзя
}
Объяснение кода листинга программы
Код представляет собой шаблонную структуру для работы с двоичными числами.
Byte<N>- это шаблонная структура, которая представляет собой двоичное число, в зависимости от значенияN. Значение двоичного числа определяется вenum, где используются операции побитового И (|) и сдвига (<<).Word<Byte1, Byte2>- это шаблонная структура, которая представляет собой слово (16-битное число), состоящее из двух байтов. Значение слова определяется вenum, где используется операция побитового И (<<) и операция объединения (|).Dword<Byte1, Byte2, Byte3, Byte4>- это шаблонная структура, которая представляет собой двойное слово (32-битное число), состоящее из четырех слов. Значение двойного слова определяется вenum, где используется операция побитового И (<<) и операция объединения (|).- В функции
Foo()используется структураWord<1010101, 10101010>::value, чтобы вывести на экран двоичное представление числа. Это число будет выводиться в двоичной системе счисления, начиная с единицы, потому что двоичное число начинается с единицы, а не с нуля.