Чтобы найти xor 2 чисел a & amp; b после того, как двоичное выражение меньшего равно равным большему, заканчивая нулями

Входные данные:
Первая строка ввода содержит целое число T, обозначающее количество тестовых случаев. Для каждого теста есть два целочисленных входа & б.

Выход:
Для каждого тестового случая вывод представляет собой целое число, отображающее XOR & б после изготовления их равной длины.

Ограничения:
1<= Т<= 100
1<= А, б<= 107

Пример:
Входные данные:
4
2 6
3 10
5 24
1 20
Выход:
2
6
12
4

Объяснение:
1. Двоичное представление 2 равно 10, а 6 — 110. Поскольку длина «10» меньше, поэтому добавьте к нему «0», сделав его «100», чтобы сделать длину двоичных представлений равной. 100 и 110 дает 010, который равен 2.

мой код

#include <iostream>
#include <cmath>
#include <sstream>
#include <cstring>
#include <string>
using namespace std;

int main()
{
int cases, binary[100];
cin>>cases;

int *result = new int[cases];
int j;
for(j=0; j<cases; j++){

stringstream ss[3];
for(int k=0; k<2; k++)
{
int n;
cin>>n;
int temp=n, i=0, len;
while(temp > 0){
binary[i] = temp%2;
temp /= 2;
i++;
}
len = i;

string str ;
for(int i=0; i<len; ++i){
stringstream ss;
ss << binary[(len-1)-i];
str += ss.str() ;
}
ss[k] << str;
}

string str1 = ss[0].str(), str2 = ss[1].str();
int len = (str1.length() > str2.length()) ? str1.length() : str2.length() ;

if(str1.length() < (unsigned)len){
int diff = len - str1.length();
for(int i=0; i<diff; ++i){
str1 += '0';
}
}
else if(str2.length() < (unsigned)len){
int diff = len - str2.length();
for(int i=0; i<diff; ++i){
str2 += '0';
}
}

string str3 = str1;
for(int i=0; i<len; ++i){
if(str1[i]==str2[i]){
str3[i]='0';
}else   str3[i]='1';
}
int length = str3.length(), val=0;
for(int i=0, m=length-1; i<length, m>=0; ++i,--m){
if(str3[i] == '1'){
val += pow(2, m);
}
}
result[j] = val;
}

for(int i=0; i<cases; i++){
cout<<result[i]<<endl;
}

return 0;
}

я думаю, что я сделал это более длинным и сложным, как сделать это простым и кратким.

0

Решение

#include <iostream>

using namespace std;

int main() {

unsigned T;
cin >> T;

unsigned a, b;
for (unsigned i=0; i<T; ++i) {

cin >> a >> b;

if (a < b)
swap(a, b);

unsigned shift = 0;

if (a > b) {
while(!(a & 0x40)) {
a <<= 1;
b <<= 1;
++shift;
}

while(!(b & 0x40))
b <<= 1;
}

cout << ((a ^ b) >> shift) << ' ';
}

return 0;
}

И некоторые объяснения:

  • хотя A и B меньше 107 и могут помещаться в один байт каждый, мы должны использовать int для его обработки, чтобы гарантировать, что разбор чисел cin будет работать правильно;
  • поскольку xor дает один и тот же результат независимо от порядка аргументов, мы могли бы поменять местами A и B, если угодно — и для нас полезно иметь A всегда не меньше B;
  • так как A и B меньше 107, мы можем быть заранее уверены, что их старший значащий бит (8-й) всегда будет нулевым, с любым возможным введенным значением, и поэтому начальные сдвиги влево сдвигаются («<<= 1 «) может выполняться до тех пор, пока 7-й бит не станет равным 1 (проверено путем применения маски 0x40 к значению A / B и проверки, если результат не ненулевой) вместо 8-го; после этого B все равно останется меньше A ;
  • Заполнение нуля b выполняется дальнейшим смещением влево b (если необходимо), пока, в свою очередь, его 7-й бит тоже не станет «1»;
  • чтобы избавиться от эффектов начального смещения влево обоих аргументов, мы должны либо сместить вправо оба из них обратно на одинаковое количество битов («>> смещение») перед хорингом, либо, что имеет тот же эффект, сместить вправо результат их xor до того, как он придет ему в голову — что более удобно (для меня).
0

Другие решения

Других решений пока нет …