在我的程序中,我在一个循环中有如下语句。
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/