C ++中的等于和与XOR

在这个问题上,我们得到一个整数n。我们的任务是创建一个程序,以查找从i = 0到n的整数计数,其中sum等于XOR,即(n + i)=(n ^ i)。

让我们举个例子来了解这个问题,

输入:  n = 4

输出 4

解释: 

考虑i从0到n的所有值,

i = 0,4 + 0 = 4,4 ^ 0 = 4
i = 1,4 + 1 = 5,4 ^ 1 = 5
i = 2,4 + 2 = 6,4 ^ 2 = 6
i = 3,4 + 3 = 7、4 ^ 3 = 7
i = 4、4 + 4 = 8、4 ^ 4 = 0
计数= 4

解决方法:

一个简单的解决方案是找到n和i之和与n和i的异或的值。比较这两个值,然后计算它们相等的值。

算法:

步骤1: 循环搜索从i = 0到n的所有值。

步骤1.1: 找到(n + i)的值。

步骤1.2: 找到(n ^ i)的值。

步骤1.3: 比较在步骤1.1和1.2中找到的值。
步骤1.4: 如果相等,则增加计数。

步骤2: 打印计 数值。

该程序说明了我们解决方案的工作原理,

示例

#include <iostream>
using namespace std;

int main() {
   
   int n = 5;
   int counter = 0;
   for(int i=0; i<=n; i++ )
      if ( (n+i) == (n^i) )
         counter++;
   cout<<"总和与XOR相等的整数的计数为 "<<counter;
   return 0;
}

输出-

总和与XOR相等的整数的计数为 2

该方法是好的,但是他们可以更好地解决该问题,这是基于以下事实:

如果n ^ i = n + i,则n&i = 0

如果n&i = 0,那么我们需要两个数字具有相反的置位和未置位位。我们需要计算这些值。这是一个执行此操作的程序,

示例

#include <iostream>
using namespace std;

int countValuesWithEqualSumXOR(int n) {
   
   int countUnSetBits=0;
   while (n) {
      if ((n & 1) == 0)
         countUnSetBits++;
      n=n>>1;
   }
   return 1 << countUnSetBits;
}

int main()
{
   int n = 6;
   cout<<"总和与XOR相等的整数的计数为 "<<countValuesWithEqualSumXOR(n);
   return 0;
}

输出-

总和与XOR相等的整数的计数为 2