如何在Golang中按位实现solidity

问题描述 投票:0回答:1

UniswapV3 Solidity 合约中的代码 TickBitmap

uint256 mask = ~((1 << bitPos) - 1);

如何在golang中实现这种可靠性计算?

我在 Golang 中创建了一些示例代码:

    a := new(big.Int).Exp(big.NewInt(2), big.NewInt(66), nil)
    a.Sub(a, big.NewInt(1))
    b := bitwiseNot(a)

func bitwiseNot(x *big.Int) *big.Int {
    mask := new(big.Int).SetBit(new(big.Int), 256, 1)
    result := new(big.Int).Xor(x, mask)
    return result
}

当我在 Remix 上测试代码时,尝试 bitpos=66,Remix 输出:

uint256: mask 115792089237316195423570985008687907853269984665640564039383797031618291433472

Go 语言输出:

115792089237316195423570985008687907853269984665640564039531370984207967846399
go solidity bitwise-operators
1个回答
0
投票

在Solidity中,

~
运算符执行按位
NOT
运算,
<<
运算符执行按位
left shift
操作。表达式
(1 << bitPos) - 1
计算直到第 bitPos 位为止所有位都设置为 1 的数字。然后,按位
NOT (~)
反转所有位。

在 Golang 中,您可以使用

math/big
包执行类似的按位运算以进行任意精度算术。但是,您必须小心按位 NOT 运算,因为标准库中的
big.Int
不直接支持它。

以下是如何在 Golang 中实现 Solidity 计算:

package main

import (
    "fmt"
    "math/big"
)

func main() {
    bitPos := 66

    // Calculate (1 << bitPos) - 1
    one := big.NewInt(1)
    bitPosBig := big.NewInt(int64(bitPos))
    mask := new(big.Int).Exp(big.NewInt(2), bitPosBig, nil)
    mask.Sub(mask, one)

    // Perform bitwise NOT
    maskNot := bitwiseNot(mask)

    fmt.Println("Golang Output:", maskNot.String())
}

func bitwiseNot(x *big.Int) *big.Int {
    // Create a mask with all bits set to 1
    mask := new(big.Int).Exp(big.NewInt(2), big.NewInt(256), nil)
    mask.Sub(mask, big.NewInt(1))

    // XOR with mask to perform bitwise NOT
    result := new(big.Int).Xor(x, mask)
    return result
}

这是游乐场链接

© www.soinside.com 2019 - 2024. All rights reserved.