我在解决一个问题,它说明我们需要找到所有最小数的和,这些最小数需要添加到数组中的元素中,以使按位和大于0。
我的方法是:首先,我决定在所有元素中找到最右边集合的位置,并检查要添加的总的最小数目,以便and大于零。但这是行不通的,有谁能帮我找到另一种Algo吗?
让我们先解决一个有点不同的问题:
为确保第k
位置的第1
(从零开始),应向值
添加最小分钟
数?
我们这里有两个案例:
min = 100...000000000 - (value & 11.....11111)
<- k zeroes -> <- k ones ->
代码(C#)
private static long AddToEnsureOne(long value, int position) {
if ((value & (1L << position)) != 0)
return 0;
long shift = 1L << (position);
return shift - (value & (shift - 1));
}
演示:如果我们有3
并且我们希望1
在第二个位置
0b011
^
we want 1 here
我们应该加上
0b100 - (0b011 & 0b11) == 4 - 3 == 1
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
考虑以下代码: 我可以理解Python(和其他语言)中的算术运算符,但我从来没有很好地理解过“按位”运算符。在上面的示例中(来自Python书籍),我理解左移位,但不理解其他两个。 此外,位运算符实际用于什么?我想举一些例子。
问题内容: 考虑以下代码: 我可以用Python(和其他语言)理解算术运算符,但我对“按位”运算符却不太了解。在上面的示例(来自Python书)中,我了解了左移功能,但不了解其他两个。 另外,按位运算符实际上是用来做什么的?我会喜欢一些例子。 问题答案: 按位运算符是对多位值进行操作的运算符,但在概念上一次只能处理一位。 仅当其两个输入均为1时,才为1;否则为0。 如果其输入之一或全部为1,则为1
问题内容: 我可以使用单个与号代替类似的按位运算符吗?可能会出现什么样的差异,是否有特定的示例可以清楚地说明此问题? 问题答案: 单身人士将始终检查这两个条件。如果双精度值判断为false,则它将在第一个条件之后停止。如果确实只需要1个2的条件为真或假,则使用2是“短路”状态检查的一种方法。 例如: 如果为,则第一个条件将失败,并且不会费心检查它的值。这是避免空指针的一种方法。 与和两个操作数始终
问题内容: 我有做乘法和加法的方法,但是我只是无法理解它们。它们都是来自外部网站,而不是我自己的: 我尝试进行逐步调试,但是对我来说确实没有多大意义,尽管它可以工作。 我可能正在寻找的是尝试并了解其工作原理(也许是数学基础?)。 编辑:这不是家庭作业,我只是想学习Java中的按位运算。 问题答案: 让我们开始看乘法代码。这个想法实际上很聪明。假设您有以二进制形式编写的n 1和n 2。然后,您可以将
问题内容: 我经常在代码中使用,如果是奇数,则返回true,如果是偶数,则返回false。 但是“&”实际上是做什么的? 问题答案: &是二进制的。如果您有一个二进制值,而您又有另一个二进制值,那么结果将是两者的按位运算。一个例子: 最右边的位是1(在这种情况下,数字是奇数)或0,在这种情况下,数字是偶数。如果您使用1表示数字,则仅查看最低有效位,而if检查该数字是1还是0。如其他人所述,请查看按
问题内容: 我想找到设置为的最高有效位。我已经从尝试一切可能的方式来进行或运算所有的位从到和它不工作。 就像我想拥有一样。 问题答案: 如果您坚持直接使用按位运算符,则可以尝试如下操作: 我们将掩码初始化为,因为它表示1后跟31 0。我们使用该值来测试索引31(第32个点)是否为1。当将此值与一起使用时,除非在中设置了相应的位,否则将得到0 。如果是这种情况,我们返回。如果不是,则将掩码向右移动1