给定一个范围[a,b](包含两者),我需要在二进制表示中找到最大数量为“1”的最小数字。我目前的方法是找到从a到b的所有数字中设置的位数,并跟踪最大值。然而,这很慢,有更快的方法吗?
您可以将 Jarlax 答案中的循环替换为“并行后缀 OR”,如下所示
uint32_t m = (a ^ b) >> 1;
m |= m >> 1;
m |= m >> 2;
m |= m >> 4;
m |= m >> 8;
m |= m >> 16;
uint32_t res = a | m;
if ((res | b) <= b)
res = b;
return res;
它通常使用ceil(log(k))步骤来概括不同大小的整数。初始测试a==b
是不必要的,a^b
将为零,因此
或者,这里有一个完全不同的方法:不断将最低的0改为1,直到不再可能。
unsigned x = a;
while (x < b) {
unsigned newx = (x + 1) | x; // set lowest 0
if (newx <= b)
x = newx;
else
break;
}
return x;
让我们找出a和b中不同的最高有效位。它将是a中的0,b中的1。如果我们将所有其他位放在1的右边,得到的数字仍在范围[a;b]中。它将是表示最大个数的单个数字。
编辑。此算法的结果始终返回 n-1 位设置为 1 的数字,其中 n 是可以更改的位数。正如注释中所指出的 - 如果b中的所有n位都设置为1,则存在错误。以下是固定的代码片段:
int maximizeBits(int a, int b) {
if (a == b) {
return a;
}
int m = a ^ b, pow2 = 1; // MSB of m=a^b is bit that we need to find
while (m > pow2) { // Set other bits to 0
if ((m & pow2) != 0) {
m ^= pow2;
}
pow2 <<= 1;
}
int res = a | (m - 1); // Now m is in form of 2^n and m - 1 would be mask of n-1 bits
if ((res | b) <= b) { // Fix of problem if all n bits in b are set to 1
res = b;
}
return res;
}
本文向大家介绍可被C整除的最大正整数,在C ++中范围为[A,B],包括了可被C整除的最大正整数,在C ++中范围为[A,B]的使用技巧和注意事项,需要的朋友参考一下 在这里,我们将看到一个有趣的问题。让我们考虑我们有三个整数A,B和C。我们必须找到一个最小整数X,使得X mod C = 0,并且X不在[A,B]范围内。如果A,B和C的值分别为5、10和4,那么X的值为4。我们必须按照以下步骤获得
问题内容: 最近在一次采访中有人问我这个问题。 给定以下代码,静态整数的最小和最大可能值是多少? 我告诉他们,最大值将为25(在没有竞争条件的情况下),而最小值将为5(在每次迭代时所有线程之间的竞争条件的情况下)。 但是面试官说,最小值甚至可以低于5。这 怎么可能? 问题答案: 我声称最小值可能是2。 这样做的关键是的非原子性,即它是读和写,它们之间可能有其他操作。 调用线程T1..T5: T1读
上面的输出是1。我不知道为什么。有人能解释一下吗? 提前谢谢。
我碰到了R的< code>range函数。它确实是一个有用的工具,并使代码更具可读性,但是如果用一个简单的包含< code>min和< code>max的一行程序来代替它,它的速度可以提高一倍。 我做了一些基准测试,range函数的“糟糕”性能让我吃惊。为了进行比较,我编写了一个名为< code>range2的函数,它使用了min和max(参见代码)。除了速度之外,如果一个简单的一行程序可以胜过这
我在让范围过滤器更具动态性方面遇到了问题。 过滤代码: 而不是硬编码的最小值0和最大值100,我想得到字段verkoopprijs的最小值和最大值。 搜索结果如下所示: 然而我不知道如何得到最小值和最大值。
我一直在寻找这个问题的答案,但运气不佳,所以希望有人能帮助我! 我正在处理周期性数据,我试图找到两个波峰和两个波谷的相关值——这不一定等同于最大/最小和第二个最大/最小值,而是最大/最小和第二个最大/最小值,条件是该值大于/小于前面和后面的值。 这是一个循环的例子 我有 1000 个周期,所以我在 dplyr 中使用group_by对周期进行分组,然后希望在组中应用条件最大值/最小值参数。 我很感