c - 有没有办法在不使用任何关系运算符的情况下将大于等于 1 的整数转换为 1?

标签 c math boolean logical-operators simd

在我的程序中,我在一个循环中有如下语句。

y = (x >= 1)? 0:1;

但是,我想避免使用任何关系运算符,因为我想使用 SIMD 指令,并且不确定关系运算符是否可以很好地与 SIMD 配合使用。

我想要类似下面的东西。

a = some_operation(x) // a will be either 1 or 0
y = 1 - a

some_operation 会将任何等于或大于 1 的数字转换为 1,并将 0 保持为 0。所以,我的问题是,是否有任何 some_operation 可以实现我的目的?

最佳答案

#define INT_BITS (CHAR_BIT * sizeof(int))

int make_zero_or_one(int x) {
   return 1 - (((x-1) >> (INT_BITS-1)) & 1);
}

与其他答案一样,这依赖于 MSB 是整数中的符号位。对于所有 <= 0 的整数,该函数返回 0,否则返回 1。如果 x-1 溢出,该函数将失败。

此实现在编译代码中没有分支。

关于c - 有没有办法在不使用任何关系运算符的情况下将大于等于 1 的整数转换为 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43693723/

相关文章:

java - 为什么这个java优雅的配对方法没有给出正确的结果?

c - 如何阻止 RAM 测试破坏其自身的嵌入式 C 变量?

c - for循环没有结束

Javascript - HTML Canvas 上的 Gecko 边框半径自适应(CSS border-radius)

algorithm - 任何快速而强大的实现来计算 3d 点云的最小边界框?

java - boolean 条件总是评估 true

json - boolean 值可以/应该用引号在 json 中传递吗?

swift - 总共标签点击两个按钮

c - 以不区分大小写的方式计算字符在文件中出现的次数时出错

c - 如何为常量大小的数组类型的变量定义名称?