'Why uint256(liquidity) is shifted by FixedPoint96.RESOLUTION in this function from Uniswap v3?

This code belongs to Uniswap-v3/core/libraries/SqrtPriceMath.sol.Why liquidity is shifted 96 bits to left?

function getNextSqrtPriceFromAmount0RoundingUp(
       uint160 sqrtPX96,
       uint128 liquidity,
       uint256 amount,
       bool add
) internal pure returns (uint160) {
    // we short circuit amount == 0 because the result is otherwise not guaranteed to equal the input price
    if (amount == 0) return sqrtPX96;
    uint256 numerator1 = uint256(liquidity) << FixedPoint96.RESOLUTION;

    if (add) {
        uint256 product;
        if ((product = amount * sqrtPX96) / amount == sqrtPX96) {
            uint256 denominator = numerator1 + product;
            if (denominator >= numerator1)
                // always fits in 160 bits
                return uint160(FullMath.mulDivRoundingUp(numerator1, sqrtPX96, denominator));
        }

        return uint160(UnsafeMath.divRoundingUp(numerator1, (numerator1 / sqrtPX96).add(amount)));
    } 
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source