Программирование >>  Дополнительные возможности наследования 

1 ... 259 260 261 [ 262 ] 263 264 265


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;



1 ... 259 260 261 [ 262 ] 263 264 265

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика