Algorithm 使位为正

Algorithm 使位为正,algorithm,data-structures,Algorithm,Data Structures,我在解决一个问题,它说我们需要找到所有需要添加到数组中元素的最小数之和,以便按位and大于0 例如:给定的数组是[4,4,3,2] 那么输出应该是3 (在第一、第二和第四元素中添加一个元素) 我的方法是:首先,我决定在所有元素中找到最右边的集合的位置,并检查要添加的总最小数,以便and大于零。但这不起作用。有人能帮我们找到另一种算法吗?让我们先解决一个稍微不同的问题: 为确保1位于kth位置(零位),应在value中添加哪个最小min数字 我们这里有两个案例: 如果value在k位置有1,我们添

我在解决一个问题,它说我们需要找到所有需要添加到数组中元素的最小数之和,以便按位and大于0

例如:给定的数组是[4,4,3,2]

那么输出应该是3

(在第一、第二和第四元素中添加一个元素)


我的方法是:首先,我决定在所有元素中找到最右边的集合的位置,并检查要添加的总最小数,以便and大于零。但这不起作用。有人能帮我们找到另一种算法吗?

让我们先解决一个稍微不同的问题:

为确保
1
位于
k
th位置(零位),应在
value
中添加哪个最小
min
数字

我们这里有两个案例:

如果
value
k
位置有
1
,我们添加
0
(不做任何操作)

如果
k
位置有
0
,我们可以添加

   min = 100...000000000 - (value & 11.....11111)
          <- k zeroes ->            <- k ones ->
我们应该补充一点

   0b100 - (0b011 & 0b11) == 4 - 3 == 1
让我们添加:
3+1==4==0b100
,它在第二位有
1

   0b011
     ^
     we want 1 here
现在我们可以扫描所有32个位置(如果integer是一个好的32位integer
int
);C#代码:

结果:

  3

请仅标记与问题相关的语言。如果不相关,因为问题是关于算法的,所以不标记是否允许将
1
添加到3d项,将
2
添加到第4项(
3
),并将
4&4&4==4
?或者我们必须在示例中添加相等的数字作为
1
?@DmitryBychenko是的,这是允许的。即使如此,结果也将是3。(1 + 2)
  private static long MinToAdd(IEnumerable<int> items) {
    long best = 0;

    for (int i = 0; i < 32; ++i) {
      long sum = 0;

      foreach (int item in items)
        sum += AddToEnsureOne(unchecked((uint)item), i); // uint - get rid of sign

      if (i == 0 || sum < best)
        best = sum;
    }

    return best;
  }
  Console.Write(MinToAdd(new int[] { 4, 4, 3, 2}));
  3