c - 这个按位表达式如何帮助找到两个整数之间的最小值和最大值?

标签 c expression bitwise-operators

https://www.geeksforgeeks.org/compute-the-minimum-or-maximum-max-of-two-integers-without-branching/

我试图找到其他方法来查找两个整数之间的最大值和最小值,并遇到了以下用于该操作的代码。任何人都可以澄清代码中按位运算符的工作和作用:

/*Function to find minimum of x and y*/
int min(int x, int y) 
{ 
    return y ^ ((x ^ y) & -(x < y)); 
} 

/*Function to find maximum of x and y*/
int max(int x, int y) 
{ 
    return x ^ ((x ^ y) & -(x < y));  
}

最佳答案

return y ^ ((x ^ y) & -(x < y));  

-(x < y)如果 x >= y 将为 0如果 x < y,则为 -1(即设置了所有位的 int) .注意 foo & -1 == foofoo & 0 == 0对于所有 foo .所以如果x < y ,我们得到 y ^ x ^ y , 等于 x因为y ^ y取消。否则我们得到 y ^ 0 ,即 y .所以我们得到 x如果x < yy否则,这正是您希望从名为 min 的函数中得到的结果.

对于 max这是一回事,除了我们返回 y如果x < yx否则。

关于c - 这个按位表达式如何帮助找到两个整数之间的最小值和最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55242326/

相关文章:

java - JxPath:评估 '' = 0

java - 使用位运算符 JAVA 交换 int[][] 数组中每行/列的顶部和底部 2 位

c++ - 这里的 & 运算符是什么意思?

c - '\0' != 0 不是真的吗?

java - 如何连接到 802.15.4 帧流?

c - c语言编程中int能容纳的最大值是多少?

c# - Lambda 表达式分配源对象

.net - boolean 和数学表达式解析器

c - MPI:如何将多个处理器中的子数组连接成一个更大的单个数组

java - Java BigDecimal 中的 Karatsuba 乘法实现