如何在 solidity 中反转 uint 的数字?
How to reverse the digits of a uint in solidity?
我正在尝试编写一个函数来反转 solidity 智能合约中 uint 的数字。
我看到 显示了如何通过从后到前循环传递的字符串的字节来可靠地反转 string,但是因为我只是关注整数我想知道是否有一种方法可以只使用整数,并且能够适当地处理溢出。
谢谢!
四处搜索,我发现 在 C 中给出了这个问题的解决方案。我能够调整它以在 Solidity 中工作。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Reverse {
function reverse_recurse(uint i, uint r) internal returns(uint) {
if (i != 0) {
uint least_digit = i % 10;
if (r >= type(uint).max / 10 && (r > type(uint).max / 10 || least_digit > type(uint).max % 10)) {
return 0; /// Overflow
}
r = reverse_recurse(i / 10, r * 10 + least_digit);
}
return r;
}
// Reverses digits in a uint, overflow returns 0
function reverse_int(uint i) public returns(uint) {
return reverse_recurse(i, 0);
}
}
decoded input { "uint256 i": "12345" }
decoded output { "0": "uint256: 54321" }
与 C 解决方案不同,它仅适用于无符号整数,因为这是我所需要的。
我正在尝试编写一个函数来反转 solidity 智能合约中 uint 的数字。
我看到
谢谢!
四处搜索,我发现
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Reverse {
function reverse_recurse(uint i, uint r) internal returns(uint) {
if (i != 0) {
uint least_digit = i % 10;
if (r >= type(uint).max / 10 && (r > type(uint).max / 10 || least_digit > type(uint).max % 10)) {
return 0; /// Overflow
}
r = reverse_recurse(i / 10, r * 10 + least_digit);
}
return r;
}
// Reverses digits in a uint, overflow returns 0
function reverse_int(uint i) public returns(uint) {
return reverse_recurse(i, 0);
}
}
decoded input { "uint256 i": "12345" }
decoded output { "0": "uint256: 54321" }
与 C 解决方案不同,它仅适用于无符号整数,因为这是我所需要的。