假设我们有一个mask
变量,它可以是0
(全部zoom )或-1
(全部为1).
我有另一个变量x
,比方说42
.
导致以下结果的按位表达式是什么(可能):
-
1
时mask == 0
-
x
时mask == -1
我试图做的是探索消除以下if
条语句的方法
unsigned x = 3;
unsigned some_number = 42;
// ~~~
if (some_number % x == 0)
{
some_number /= x;
}
关于我正在处理的特定问题中的type个变量(见下文),所有的数字都是无符号整数,例如unsigned
.
EDIT 2 (MISTAKE):我做了一个mistake,忘记了掩码是0
(all zeros)或-1
(all ones),这是我之前说的1
(只是其最低有效位是1).Please accept my apologies as I wasted your precious time.
EDIT 1:个
总体而言,重点是使用if-else
个构造(包括条件运算符(?:
)).相反,我正在寻找与branchless个实践中使用的位操作类似的位操作.这个问题不是它在这种情况下是否会表现得更好,也不是答案是否可以被认为是一种好的做法.这只是为了探索比特操纵的世界.
这是我的try
// Check whether some_number is divisible by x
unsigned mask = ((some_number % x) - 1) >> 31;
unsigned deonm = // ??
some_number =/ denom
我用它来回答欧拉项目的third个问题,代码如下
size_t largest_prime_factor(size_t number)
{
if (number < 2) return 0;
if (number == 2) return 2;
while ((number & 1) == 0)
{
number >>= 1;
}
size_t lpf = 2;
size_t i = 3;
size_t max_iter = sqrt(number);
while (i < max_iter)
{
size_t mask = ((number % i) - 1) >> 31;
lpf = (i & mask) | (lpf & ~mask);
number /= X; // mask = 0 => X=1; mask = 1 => X=i
i += 2;
}
return lpf;
}
注:如果可能,请建议一个更好的标题.