Răspuns :
#include <iostream>
#include <stdint.h>
using namespace std;
int main()
{
uint32_t N;
uint16_t K;
std::cin >> N >> K;
uint32_t bit = 1;
for (uint16_t i = 1; i <= K; i++) bit <<= 1;
N ^= bit;
cout << N;
}
► Explicatie :
Folosim uint16_t si uint32_t aflate in fisierul stdint.h pentru a avea control mai mare asupra tipurilor de date folosite. Evident, uint16_t este un numar intreg fara semn pe 16 biti iar uint32_t este pe 32 de biti.
Functia logica XOR pentru doua valori binare a si b functioneaza in felul urmator :
- daca b este 0 atunci rezultatul in urma evaluarii este a
- daca b este 1 atunci rezultatul in urma evaluarii este !a
Noi nu o aplicam intre doua valori binare, o aplicam pe doua numere intregi fara semn pe 32 de biti, bit cu bit, dar ideea este aceasi.
Trebuie deci sa faci XOR intre N si o variabila denumita de mine "bit". Aceasta variabila are 1 pe pozitia pe care dorim sa o schimbam in N si 0 in rest. Pentru a afla valoarea acesteia realizam shiftare pe biti la stanga de K ori in variabila bit care initial are valoarea 1.
►Operatori C++ folositi :
- Shiftare pe biti la stanga a numarului a cu b pozitii : a << b. Expresia se evalueaza la valoarea shiftata dar nu schimba valoarea lui a. Pentru ca valoarea lui a sa se schimbe folosim a<<=b care este echivalent cu a = a<<b
- XOR pe biti intre a si b : a ^ b. Expresia se evalueaza la valoarea ceruta dar nu schimba valoarea lui a. Pentru ca valoarea lui a sa se schimbe folosim a^=b care este echivalent cu a = a^b
Te sfatuiesc sa consulti documentatia pentru a afla mai multe lucruri despre operatorii pe biti daca nu ai inteles cum au fost folositi.
Vă mulțumim că ați vizitat platforma noastră dedicată Informatică. Sperăm că informațiile prezentate v-au fost utile. Dacă aveți întrebări sau aveți nevoie de suport suplimentar, vă rugăm să ne contactați. Vă așteptăm cu drag și data viitoare! Nu uitați să adăugați site-ul nostru la lista de favorite!