Solidity
在 Solidity 中檢查 int256 符號的最快方法是什麼?
給定一個 int256 數字 n,我想得到 n 的符號:
- 如果 n 為正,則取 1
- 如果 n 為負數,則得到 -1
- 如果 n 為 0,則得到 0
我知道我可以做到:
function foo(int256 x) external { if (x > 0) { // ... } else if (x < 0) { // ... } else { // ... } }
但這在我的程式碼中引入了三個邏輯分支,即gas。
有更快的方法嗎?也許通過某種位操作?
在顯示程式碼之前,想法是使用三元運算符。
condition ? value_if_true : value_if_false
小心,因為在 Solidity
0.8
版本中溢出/下溢會導致恢復,所以如果你正在使用^0.8.x
,你將需要使用一個unchecked {...}
塊。Solidity
0.8.0
發布前的程式碼:function sign(int256 x) external pure returns (int8) { return int8(((0 < x) ? 1 : 0) - ((x < 0) ? 1 : 0 )); }
Solidity
0.8.0
發布後的程式碼:function sign(int256 x) external pure returns (int8) { unchecked { return int8(((0 < x) ? 1 : 0) - ((x < 0) ? 1 : 0 )); } }