关于无比较运算符求两数最小值位运算公式的疑问
关于无分支求两数最小值公式的疑惑解答
嘿,这个问题我之前也纠结过,咱们一步步拆解清楚,你就能明白哪里出问题啦~
首先要纠正你一个关键误解:有符号整数的算术右移,是补符号位而不是补0,这也是你推导出错的核心原因。咱们拿x=4、y=6的情况重新算一遍:
- 计算
x-y:4-6=-2。在32位有符号int的补码表示中,-2的二进制是:11111111 11111111 11111111 11111110(原理:2的二进制是000...0010,取反得到111...1101,加1就变成111...1110)。 - 对
x-y右移31位:因为是有符号数,算术右移会补符号位(也就是最高位的1),所以右移31位后得到的是全1的二进制数,对应的十进制是-1,而不是你以为的1! - 计算
(x-y) & ((x-y) >> 31):也就是-2 & -1。二进制里-1是全1,按位与任何数都会保留原数的所有位,所以结果就是-2。 - 代入公式:
y + (-2) = 6 + (-2) = 4,正好是正确的最小值x=4。
再回顾正数的情况验证一下逻辑:当x=6、y=4时,x-y=2是正数,二进制是000...0010,右移31位补0得到0,所以2 & 0 =0,公式结果是4+0=4,完全正确。
这个公式的核心逻辑其实很巧妙:
- 当
x > y时,x-y为正,右移31位后是0,公式等价于y + 0,取到较小的y; - 当
x < y时,x-y为负,右移31位后是-1,(x-y) & -1等于x-y本身,公式等价于y + (x-y) =x,取到较小的x。
内容的提问来源于stack exchange,提问作者sandywho
相关产品推荐
相关产品推荐

