сложить два бита, один из которых установлен, а другой сброшен, бит результата будет равен 1, а бит переноса — 0. Перед вами таблица, которая обобщает эти правила сложения
Левый бит lhs Правый бит rhs Перенос Результат
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0
Рассмотрим логику бита переноса. Если оба суммируемых бита (lhs и rhs) равны 0 или хотя бы один из них равен 0, бит переноса будет равен 0. И только если оба бита равны 1, бит переноса будет равен 1. Такая ситуация в точности совпадает с определением побитового оператора И (&).
Если подобным образом рассмотреть логику бита результата, то окажется, что она совпадает с выполнением оператора побитового исключающего ИЛИ (^): если любой из суммируемых битов (но не оба сразу) равен I, бит результата равен 1, в противном случае — 0.
Полученный бит переноса добавляется к следуюшему значимому биту. Это можно реализовать либо итеративным проходом через каждый бит, либо использованием рекурсии.
#include <iostream.h>
unsigned int add( unsigned int lhs, unsigned lnt rhs )
{
unsigned int result, carry;
while ( 1 )
{
result = lhs ^ rhs;
carry = lhs & rhs;
if ( carry == 0 )
break;
lhs = carry << 1;
rhs = result;
};
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;
}
В качестве альтернативного варианта эту проблему можно решить с помошью рекурсии:
#include <iostream.h>
unsigned int add( unsigned int lhs, unsigned int rhs )
{
unsignod int carry = lhs & rhs;
unsigned int result = lhs * 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;
}
#include <iostream.h>
int main() { cout << "Hello World!\n" return 0; } (обратно)
int main() { unsigned short x; unsigned short у; unsigned short z; z = x * у; return 0; }
(обратно)
int main() { unsigned short Width; unsigned short Length; unsigned short Area; Area = Width * Length; return 0; } (обратно) Ниже приводится синтаксис оператора if. Форма 1: if (условие) выражение; следующее выражение; Если условие возвращает true, то выполняется выражение, а за ним и следующее выражение. Если условие возвратит false, то выражение игнорируется, а программа переходит к выполнению следующего выражения. Помните, что вместо выражения может использоваться целый блок, заключенный в фигурные скобки. Форма 2: if (условие) выражение1; else выражение2; следующее выражение; Если условие возвращает значение true, выполняется выражение1, в противном случае выполняется выражение2. После этого выполняется следующее выражение. Пример: if (SomeValue < 10); cout << "SomeValue is less than 10"; else cout << "SomeValue is not less than 10!"; cout << "Done." << endl; (обратно)
int main() { cout << "Hello World!\n" return 0; } (обратно)
int main() { unsigned short x; unsigned short у; unsigned short z; z = x * у; return 0; }
(обратно)
int main() { unsigned short Width; unsigned short Length; unsigned short Area; Area = Width * Length; return 0; } (обратно) Ниже приводится синтаксис оператора if. Форма 1: if (условие) выражение; следующее выражение; Если условие возвращает true, то выполняется выражение, а за ним и следующее выражение. Если условие возвратит false, то выражение игнорируется, а программа переходит к выполнению следующего выражения. Помните, что вместо выражения может использоваться целый блок, заключенный в фигурные скобки. Форма 2: if (условие) выражение1; else выражение2; следующее выражение; Если условие возвращает значение true, выполняется выражение1, в противном случае выполняется выражение2. После этого выполняется следующее выражение. Пример: if (SomeValue < 10); cout << "SomeValue is less than 10"; else cout << "SomeValue is not less than 10!"; cout << "Done." << endl; (обратно)