Website Summary Files Commits Branches @commit @diff @stats
path: root / Sem. 5 / Task 3.cpp
blob: 6723ee2c34b7d25fa2fae5c1ced60f60a49231a7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;


//Алгоритъмът за събиране с 1 в двоичен запис:
//От дясно на ляво - правим всички 1-ци на 0, докато не срещнем първата 0.
//Първата 0 я правим на 1.

//  101001111 + 1
//  101010000
int main()
{
	unsigned int n;
	cin >> n;

	int mask = 1; //Най-десният бит на маската е 1-ца. Всички други са 0-ли.


	while ((n & mask) > 0) //Проверяваме дали текущия бит е 1-ца. (при първото влизане, проверяваме най-десния)
	{
		n ^= mask;  // Правим го на 0  ( n = n ^ mask)  
		mask <<= 1; // Отместваме маската, за да проверим бит-а в ляво. (mask = mask << 1)
	}

	//Открили сме първата 0. 1-цата е на точната позиция в маската.
	n |= mask; // Правим на 1-цa  (n = n | mask) 
}