欢迎订阅专栏:3分钟Solidity--智能合约--Web3区块链技术必学
如需获取本内容的最新版本,请参见 Cyfrin.io 上的Assembly Math(代码示例)
汇编中的数学示例
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
contract AssemblyMath {
function yul_add(uint256 x, uint256 y) public pure returns (uint256 z) {
assembly {
z := add(x, y)
if lt(z, x) { revert(0, 0) }
}
}
function yul_mul(uint256 x, uint256 y) public pure returns (uint256 z) {
assembly {
switch x
case 0 { z := 0 }
default {
z := mul(x, y)
if iszero(eq(div(z, x), y)) { revert(0, 0) }
}
}
}
// 四舍五入到最接近的b的倍数
function yul_fixed_point_round(uint256 x, uint256 b)
public
pure
returns (uint256 z)
{
assembly {
// b = 100
// x = 90
// z = 90 / 100 * 100 = 0, want z = 100
// z := mul(div(x, b), b)
let half := div(b, 2)
z := add(x, half)
z := mul(div(z, b), b)
// x = 90
// half = 50
// z = 90 + 50 = 140
// z = 140 / 100 * 100 = 100
}
}
}
Remix Lite 尝试一下
END