如果设置了最低位,则有条件地无分支异或
XOR conditionally without branching if the lowest bit is set
我有三个无符号32位整数,例如a
, b
和c
。如果b
的最低位是1,我想将c
与a
异或,并将结果存储到c
中。我们可以这样做:
#include <cassert>
int main()
{
// Some values for a and c
unsigned a = 16;
unsigned c = 25;
unsigned b = 5; // 101_2
if(b & 1)
{
c ^= a;
}
assert(c == 9);
}
我可以在没有分支的情况下有条件地执行此操作吗,也就是说,没有if语句?
有很多方法可以做到这一点。这是另一个,没有乘法,只有4个运算。
c ^= a&(-(b&1));
应该可以了
c ^= a * ( b & 1 );
如果没有if
语句和分支,您必须检查编译器的汇编转储:
c ^= ~((b & 1) - 1) & a;
相关文章:
- 如何使用 soong 命名空间来有条件地编译模块
- 函数指针与条件分支
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 条件分支评估
- 根据模板类型有条件地删除变量
- 有条件地选择带有 decltype() 和三元运算符的类型
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 有条件的打印和计数在 std::map 上有限制
- 如何在 c++ 中有条件地包含标头?
- 如何仅在Qt是用ltcg构建时才有条件地启用ltcg?
- 如何在Visual Studio 2019中有条件地编译c++源文件
- C++可以有条件地向下转换类指针吗
- 使用 SFINAE 有条件地解析分配器成员
- 有条件地删除宏
- Clang++ 6.0 内存清理器未报告返回值指示条件分支的函数中的未初始化局部变量
- 有条件地包含C++标准库
- 如何有条件地将元素添加到 std::array - C++11
- 是否根据编译器版本有条件地包含源文件
- 最佳无分支有条件选择两个SSE2填充双打
- 如果设置了最低位,则有条件地无分支异或