Solidity

在 Solidity 中檢查 int256 符號的最快方法是什麼?

  • April 1, 2021

給定一個 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

小心,因為在 Solidity0.8版本中溢出/下溢會導致恢復,所以如果你正在使用^0.8.x,你將需要使用一個unchecked {...}塊。

Solidity0.8.0發布前的程式碼:

function sign(int256 x) external pure returns (int8) {
   return int8(((0 < x) ? 1 : 0) - ((x < 0) ? 1 : 0 ));
}

Solidity0.8.0發布後的程式碼:

function sign(int256 x) external pure returns (int8) {
   unchecked {
       return int8(((0 < x) ? 1 : 0) - ((x < 0) ? 1 : 0 ));
   }
}

引用自:https://ethereum.stackexchange.com/questions/96529