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 ales să vizitați site-ul nostru dedicat Informatică. Sperăm că informațiile disponibile v-au fost utile. Dacă aveți întrebări sau aveți nevoie de asistență suplimentară, vă rugăm să ne contactați. Revenirea dumneavoastră ne va bucura, iar pentru acces rapid, nu uitați să ne salvați la favorite!