当前位置: 首页 > 编程笔记 >

计算要翻转的最小位,以便在C ++中A和B的XOR等于C

微生雨泽
2023-03-14
本文向大家介绍计算要翻转的最小位,以便在C ++中A和B的XOR等于C,包括了计算要翻转的最小位,以便在C ++中A和B的XOR等于C的使用技巧和注意事项,需要的朋友参考一下

给出三个长度为N的二进制序列A,B和C。每个序列代表一个二进制数。我们必须找到没有。对A和B中的位进行所需的翻转,以使A和B的XOR导致C。XOR B变为C。

首先让我们了解XOR运算的真值表-

X ÿ X XOR Y
0 0 0
0 1 1
1 0 1
1 1 0

从上表中我们观察到,对于X和Y中相同的值,X XOR Y结果为0,否则结果为1。因此,这对于查找要在A和B中翻转到C的位将很有帮助。

  • 如果A [i] == B [i]并且C [i] == 0,则没有翻转,

  • 如果A [i] == B [i]并且C [i] == 1,则翻转A [i]或B [i]并将翻转数增加1

  • 如果A [i]!= B [i]并且C [i] == 0,则翻转A [i]或B [i]并将翻转计数增加1

  • 如果A [i]!= B [i]和C [i] == 1,则不需要翻转。

输入值

A[]= { 0,0,0,0 } B[]= { 1,0,1,0 } C= {1,1,1,1}

输出结果

Required flips : 2

说明

A[0] xor B[0] 0 xor 1 = 1 C[0]=1 no flip
A[1] xor B[1] 0 xor 0 = 0 C[0]=1 flip count=1
A[2] xor B[2] 0 xor 1 = 1 C[0]=1 no flip
A[3] xor B[3] 0 xor 0 = 0 C[0]=1flip count=2

输入值

A[]= { 0,0,1,1 } B[]= { 0,0,1,1 } C= {0,0,1,1}

输出结果

Required flips : 2

说明

A[0] xor B[0] 0 xor 0 = 0 C[0]=0 no flip
A[1] xor B[1] 0 xor 0 = 0 C[0]=0 no flip
A[2] xor B[2] 1 xor 1 = 0 C[0]=1 flip count=1
A[3] xor B[3] 1 xor 1 = 0 C[0]=1 flip count=2

以下程序中使用的方法如下

    list-paddingleft-2">
  • 数组a [],b []和c []用于存储二进制编号。

  • 函数flipCount(int A [],int B [],int C [],int n)以数组a,b,c及其长度n作为输入,并以A []或B的位返回所需的翻转次数[]获得C []作为A xor B

  • 可变计数表示翻转计数,并以0初始化。

  • 使用for循环遍历单元中从i = 0到i的每个位

  • 对于每个比特A [i]和B [i]。如果它们相等且C [i]为1增加计数。

  • 对于每个比特A [i]和B [i]。如果它们不相等并且C [i]为0,则增加计数。

  • 返回计数作为所需结果。

示例

#include<bits/stdc++.h>
using namespace std;
int flipCount(int A[], int B[], int C[], int N){
   int count = 0;
   for (int i=0; i < N; ++i){
      //如果A [i]和B [i]相等,则XOR结果为0,如果C [i]为1,则
      if (A[i] == B[i] && C[i] == 1)
         ++count;
         //如果A和B都不相等,则XOR结果为1,如果C [i]为0,则翻转
      else if (A[i] != B[i] && C[i] == 0)
         ++count;
   }
   return count;
}
int main(){
   //N代表总位数
   int N = 5;
   int a[] ={1,0,0,0,0};
   int b[] ={0,0,0,1,0};
   int c[] ={1,0,1,1,1};
   cout <<"翻转的最小位数,以使A和B的XOR等于C:"<<flipCount(a, b, c,N);
   return 0;
}

输出结果

翻转的最小位数,以使A和B的XOR等于C:2
 类似资料:
  • 本文向大家介绍计算三元组(a,b,c)的数量,以使C ++中a ^ 2 + b ^ 2 = c ^ 2和1 <= a <= b <= c <= n,包括了计算三元组(a,b,c)的数量,以使C ++中a ^ 2 + b ^ 2 = c ^ 2和1 <= a <= b <= c <= n的使用技巧和注意事项,需要的朋友参考一下 我们得到一个整数n。目标是找到满足条件的三元组(3个数字一组)- a 2

  • 本文向大家介绍在数组中找到四个元素a,b,c和d,以便在C ++中a + b = c + d,包括了在数组中找到四个元素a,b,c和d,以便在C ++中a + b = c + d的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个整数列表。我们的任务是找到四个不同的整数,分别为(a,b)和(c,d)两对,这样a + b = c + d。如果有多个答案,则仅打印一个。假设数组元素像:A = [7

  • 问题是要找出A和B(包括A和B)之间的数字总数等于S。 同时打印A和B(含)之间的最小数字。 输入: 由A、B、S组成的单线。 输出: 两行。 在第一行中,A和B之间的整数数,其位数之和等于S。 在第二行中,A和B之间的最小数字。 约束: 1. 1. 来源:黑客地球 我的解决方案只适用于30%的输入。对此最好的解决方案是什么? 我现在使用的算法计算最小数字的和,然后在十位数的每次更改后再次计算和。

  • 我有两个双向量。双的值在-1000到1000之间。 两个向量包含相同的数字,但顺序不同。 例如 假设通过以下方式求和,是否可以保证向量1的和与向量2的和完全相等: 我担心双重不精确。

  • 本文向大家介绍计算在C ++中除数等于K的 我们给了两个数字N和K。目标是找到1到N之间具有等于[[,N]]中的K除数的除数。 我们将首先计算范围[1,N]中的K的除数,然后将其存储在变量count中。 现在我们将从i = 1到i = N开始。现在,对于每个数字num = i(使得i!= K),将num的除数计数在范围[1,N]中。并将它们的出现存储在变量除数中。 如果除数=计数,则num在[1,

  • 本文向大家介绍计算元素,以便在C ++中恰好有X个元素的值大于或等于X,包括了计算元素,以便在C ++中恰好有X个元素的值大于或等于X的使用技巧和注意事项,需要的朋友参考一下 给我们一个整数数组。目标是找到满足以下条件的数组中元素的数量- 对于每个元素,数组中存在的大于或等于它的数字计数应完全等于它。排除元素本身。如果element是X,则数组具有正好X个数字,这些数字大于或等于X。(不包括元素)