假设我们有一个mask变量,它可以是0(全部zoom )或-1(全部为1).

我有另一个变量x,比方说42.

导致以下结果的按位表达式是什么(可能):

  • 1mask == 0
  • xmask == -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;
}

注:如果可能,请建议一个更好的标题.

推荐答案

我将假设掩码(我将称为m)为x,结果(我将称为r)是相同大小的无符号整数类型.我称它为TYPE式.


对于大多数比特来说,这很容易:ri=xi&;mi

但最低有效位(r0)是不同的.下面显示了基于m0和x0的值的r0的期望值:

r0 m0 = 0 m0 = 1
x0 = 0 1 0
x0 = 1 1 1

因此我们得到r0=~m0|x0

现在,我们只需要将它们结合起来.

我们希望将第一条规则应用于除最后一位之外的所有位.这可以通过使用允许通过除最后一位(... & ( ~(TYPE)1 ))之外的所有位的掩码来实现.

我们只想对最后一点应用第二条规则.这可以通过使用仅允许通过最后一位(... & 1)的掩码来实现.

总而言之:

r = ( x & m & ( ~(TYPE)1 ) ) | ( ( ~m | x ) & 1 );

现在,我们有了一个仅具有位操作的解决方案(以及可以通过使用正确的数字文字后缀来避免的强制转换).

C++相关问答推荐

在Windows上构建无聊的SSL x64

va_copy的使用是未定义的行为吗?

如何在Visual Studio代码中关闭此函数名称显示功能?

如何在C宏中确定 struct 中元素的类型?

C语言编译阶段与翻译阶段的关系

如何在c++中包装返回空*的函数

以下声明和定义之间的区别

Clang警告称,`ffi_type`与`sizeof`不兼容

在基本OpenGL纹理四边形中的一个三角形中进行渲染

在编写代码时,Clion比vscode有更多的问题指示器

C:如何将此代码转换为与数组一起使用?

如何在不更改格式说明符的情况下同时支持双精度和长双精度?

共享目标代码似乎不能在Linux上的进程之间共享

x86-64平台上的int_fast8_t大小与int_fast16_t大小

";错误:寄存器的使用无效;当使用-masm=intel;在gcc中,但在AT&;T模式

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?

为什么INT_MIN是在c语言的头文件limits.h中定义的(-INT_MAX-1)而不是直接使用-2147483648

全局变量 y0 与 mathlib 冲突,无法编译最小的 C 代码

段错误try 访问静态字符串,但仅有时取决于构建环境

设置具有非零终止字符串的大整数