32 lines
1.2 KiB
JavaScript
32 lines
1.2 KiB
JavaScript
/**
|
||
* @param {number} a
|
||
* @param {number} b
|
||
* @return {number}
|
||
*/
|
||
export const maximum = function (a, b) {
|
||
// return Math.max(a, b)
|
||
// 不得使用if-else或其他比较运算符,那么我们也尽可能回避abs、max这些函数
|
||
// return (a + b) / 2 + Math.abs(a - b) / 2
|
||
// return (a + b) / 2 + Math.abs(a - (a + b) / 2)
|
||
// return ((a + b) + Math.abs(a - b)) / 2
|
||
|
||
// 1.两个符号相同不会溢出,符号不同可能溢出
|
||
// 2.所以的分别对a,b两值的符号位求异或
|
||
// 3.符号相同直接取k,符号不同,判断a的符号位
|
||
const ak = a >>> 63
|
||
const bk = b >>> 63 // 符号位
|
||
const diff = ak ^ bk// 求异或,相同为0,不同为1
|
||
let k = (a - b) >>> 63
|
||
// 如果符号相同就取k,符号不同就判断ak符号得出k,是0还是1
|
||
k = k & (diff ^ 1) | (ak & diff)
|
||
return b * k + a * (k ^ 1)
|
||
|
||
// const k = ((a - b) >> 63) & 1
|
||
// return b * k + a * (k ^ 1)
|
||
|
||
// const k = (a - b) >>> 63
|
||
// return b * k + a * (k ^ 1)
|
||
|
||
// k就是把符号位取出来,1是负数,0是正数。负数说明b大,所以b*1+a*0不就是b吗。反之,如果是正数,说明a大,那么就是b*0+a*1就等于 a了。
|
||
}
|