c - 如果两个相等,否则第一个相等,是否有非分支按位解决方案来确定 "odd one out of 3"数字?

标签 c bit-manipulation bitwise-operators

int64_t foo(int64_t a, int64_t b, int64_t c){
    return a == b ? c : a == c ? b : a;
}

是否有任何非分支按位黑客可以实现上述功能?

最佳答案

是的,它们是:

return ((!(a-b))*(c^a))^((!(a-c))*(b^a))^a;

if a=b=c: (1*(c^a))^(1*(b^a))^a = a^b^c= a

if a=b != c: then (1*(c^a))^0^a= c^a^a= c

a=c != b相同

if a != b != c: (0*(a^c))^(0*(a^b))^a = 0^0^a=a

这种方式是否更快值得怀疑,但是尝试一下。

UB-警告。 如果 a-ba-c 导致上溢或下溢,则这是未定义的行为。可以使用无符号变量。

关于c - 如果两个相等,否则第一个相等,是否有非分支按位解决方案来确定 "odd one out of 3"数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36378536/

相关文章:

java - 如何修复构建 Android 时的错误 : Use of undeclared identifier ‘V4L2_COM_CMD_FLUSH’

嵌套结构的 C 问题(看起来 1 个实例是在没有明确定义的情况下定义的)

c - C中的这种逻辑移位有什么问题

java - Java 中的快速按位操作

java - 右操作数为负时位移运算符的行为

无法使预编译头与arm-none-eabi-gcc一起工作

Char * 数组混淆

javascript - 对于 JavaScript 字符串等场景,base128 编码的可行性如何?

c# - 按位枚举强制转换返回值不是预期的

algorithm - 在 (0,n) 范围内生成 k & x = k 的解