我正在嘗試創建一個函式來查找作為引數輸入的 4 個數字中最大的一個。
使用 solidity 匯編代碼。
我已經成功地獲得了 2 個數字中的最大值,但似乎無法弄清楚這個數字。
這是我的代碼,它每次都回傳 0
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.4.26;
contract LargestOfFourNums {
function largestOfFour(
uint256 num1,
uint256 num2,
uint256 num3,
uint256 num4
) public view returns (uint256 result) {
assembly {
let winnerA := gt(num1, num2)
let winnerB := gt(num3, num4)
jumpi(num1Greater, gt(winnerA, winnerB))
jump(num2Greater)
num1Greater:
result := winnerA
jump(end)
num2Greater:
result := winnerB
end:
}
}
}
我試過使用 mstore(0x80, winnerA)
但這似乎并沒有改變什么。
我什至嘗試了 sload(0x80) 和 sload(winnerA) 來嘗試稍后呼叫它
uj5u.com熱心網友回復:
為什么額外的跳躍?jump(num2Greater)無論如何都是多余的。在其中一種情況下,您可能會讓代碼“失敗”。
您可以使用 next 方法獲取兩個 32 位整數中的最大值和最小值:
c = a - b
k = (c >> 31) & 1
max = a - k * c
min = b k * c
這允許無分支解決方案:
assembly {
let maxA := sub(num1, mul(lt(num1, num2), sub(num1, num2)))
let maxB := sub(num3, mul(lt(num3, num4), sub(num3, num4)))
result := sub(maxA, mul(lt(maxA, maxB), sub(maxA, maxB)))
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/533857.html
標籤:功能部件坚固性评估值
