Solidity

右移在內聯彙編中不起作用

  • May 4, 2022

我在智能合約中進行線上組裝。

function rightShift(uint256 x) public pure returns (uint256 result) {
      assembly {
         result := shr(x,1)
      }
   }

上面的函式總是返回零。我做錯了什麼還是錯誤?

始終仔細檢查文件

shr(x, y) 將 y 邏輯右移 x 位

使用您的符號,您實際上是向右移動位1x對於任何非零值,結果將為零。

您可能打算寫:

function rightShift(uint256 x) public pure returns (uint256 result) {
  assembly {
     result := shr(1,x)
  }
}

我們來看看Yul 指令的定義:shr

shr (x, y):邏輯右y移位x

您的函式始終返回 0,因為您正在移動x(您的變數x)位,而不是 1 位。

為了讓它工作,你必須像這樣重寫它:

function rightShift(uint256 x) public pure returns (uint256 result) {
   assembly {
       result := shr(1, x)
   }
}

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