Nu obții 100 de puncte sau ai nelămuriri în privința problemelor? Scrie-mi pe Instagram.
Ai găsit o greșeală, vrei să raportezi un utilizator sau vrei să comunici altceva? Folosește formularul de contact.
Vrei să ne transmiți o părere despre platformă? Folosește formularul de feedback.
Folosește următoarele shortcuturi pentru a naviga mai ușor pe platformă.
Meniu shortcuturi | ? |
Căutare probleme sau utilizatori | / |
Navigare printre rezultatele căutării | ↑, ↓ |
Meniu de contact și feedback | CTRL + Shift + F |
Ieșire din meniuri | Esc |
Setări editor | CTRL + Shift + S |
Schimbare stil editor | CTRL + Shift + E |
Șabloane de cod | CTRL + Shift + 1/2/3 |
Golire editor | CTRL + Shift + 4 |
Dându-se un număr natural n
, să se găsească bitul de 1
cel mai puțin semnificativ al lui n
.
Exemplu. Pentru n = 10
, reperezentarea sa binară este 1010
, iar cel mai puțin semnificativ bit de 1
este cel de pe poziția 1
:
Vom parcurge biții numărului pe rând, de la poziția 0
până când întrecem valoarea n
. Când întâlnim un bit de 1
, ne oprim și afișăm poziția.
Vom genera puterile de 2
: 20 = 1
, 21 = 2
, 22 = 4
, …, până când întrecem valoarea n
. Știm că o putere 2k
are în reprezentarea sa binară k
cifre de 0
, după care o cifră de 1
:
22 = 4 = 10
24 = 16 = 10000
20 = 1 = 1
Cu această observație, dacă facem AND
între 2^i
și n
, putem afla dacă al i
-lea bit din număr este 1
sau 0
.
Iată codul în C++:
#include <iostream>
using namespace std;
int main()
{
//Declarăm și citim numărul nostru, n
int n;
cin >> n;
//Determinăm cel mai puțin semnificativ bit de 1
int i = 0, j = 1; //i este poziția curentă (0, 1, 2, …), j = 2^i (1, 2, 4, …)
while(j <= n) {
if(j & n) { //Verificăm dacă al i-lea bit este 1
cout << i;
break;
}
i++; //Creștem puterea
j = j * 2;
}
return 0;
}