|
Программирование >> Дополнительные возможности наследования
12 13 14 15 16 17 18 19 #elif DEBUG == 2 #define ASSERT(x) \ if (! (X) ) \ cout ERROR!! Assert #x failed\n ; \ cout on line LINE \n ; \ cout in file LINE \n ; \ #endif 3. Напишите макрос DPrint, который проверяет, определена ли лексема DEBUG, и, если да, выводит значение, передаваемое как параметр. #ifndef DEBUG: #define DPRINT(string) #else #define DPRINT(STRING) cout #STRING ; #endif 4. Напишите программу, которая складывает два числа без использования операции сложения (+). Подсказка: используйте побитовые операторы! Если рассмотреть сложение двух битов, то можно заметить, что ответ будет содержать два бита: бит результата и бит переноса. Таким образом, при сложении двух единиц в двоичной системе бит результата будет равен нулю, а бит переноса - единице. Если сложить два двоичных числа 101 и 001, получим следующие результаты: 101 5 001 1 110 6 Следовательно, если сложить два соответствующих бита (каждый из них равен единице), то бит результата будет равен О, а бит переноса - 1. Если же сложить два сброшенных бита, то и бит результата, и бит переноса будут равны 0. Если сложить два бита, один из которых установлен, а другой сброшен, бит результата будет равен 1, а бит переноса - 0. Перед вами таблица, которая обобщает эти правила сложения Левый бит Ihs Правый бит rhs Перенос Результат О О 0 0 0 1 0 1 1 О О 1 1 10 Рассмотрим логику бита переноса. Если оба суммируемых бита (Ihs и rhs) равны О или хотя бы один из них равен О, бит переноса будет равен 0. И только если рба бита равны 1, бит переноса будет равен 1. Такая ситуация в точности совпадает с определением побитового оператора И (&). Если подобным образом рассмотреть логику бита результата, то окажется, что она совпадает с выполнением оператора побитового исключающего ИЛИ (~): если любой из суммируемых битов (но не оба сразу) равен 1, бит результата равен 1, в противном случае - 0. Полученный бит переноса добавляется к следующему значимому биту. Это можно реализовать либо итеративным проходом через каждый бит, либо использованием рекурсии. ftinclude <iostrean.h> unsigned int add( unsigned int Ihs, unsigned int rhs ) { unsigned int result, carry; while ( 1 ) result = Ihs rhs; carry = Ihs & rhs; if ( carry == 0 ) break; Ihs = carry 1; rhs = result; return result; > int nainO { unsigned long a, b; for (;;) cout Enter two numbers, (0 0 to stop): ; cin a b; if (!a && !b) break; cout a + b = add(a,b) endl; return 0; В качестве альтернативного варианта эту проблему можно решить с помошью рекурсии: (tinclude <iostream, h> unsigned int add( unsigned int Ihs, unsigned int rhs ) { unsigned int carry = Ihs 4 rhs; unsigned int result = Ihs rhs; if ( carry ) return add( result, carry 1 ); else return result; int main() { unsigned long a, b; for (;;) cout Enter two numbers. (0 0 to stop): ; cin a b; if (!a && !b) break; cout a + b = add(a,b) endl; return 0;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |