js-practice/src/math/maximum-lcci.js
2020-05-05 20:25:19 +08:00

32 lines
1.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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.所以的分别对ab两值的符号位求异或
// 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了。
}