Aptos Move 性能优化:位运算与移位操作实战

· 8min · Paxon Qiao

Aptos Move 性能优化:位运算与移位操作实战

在掌握了 Move 语言的高层逻辑后,一个专业的智能合约开发者还需要深入理解其底层操作,这正是实现极致性能和 Gas 优化的关键所在。位运算(Bitwise)与移位运算(Bitshift)作为程序语言中最接近硬件的指令,能让我们以最高效的方式处理数据。

这篇实战教程将为你揭开位操作的神秘面纱。我们将通过清晰的代码示例和可验证的单元测试,手把手带你学习按位与、或、异或以及左右移位等核心操作。读完本文,你将获得一套强大的底层工具,并理解如何在 Move 中利用它们来编写更紧凑、更高效、更专业的代码。

本文是一篇 Aptos Move 底层操作实战指南,深入讲解位运算(&, |, ^)与移位运算(<<, >>)的原理及应用。你将通过编写和测试代码,掌握这些在性能优化、数据压缩和权限管理中的关键底层技巧。

Aptos Move Bitwise and Bitshift Operations

Bitwise(位运算):直接对二进制位进行操作,常见运算包括

  • 与(&):两位都为1时结果为1,否则为0。
  • 或(|):两位任一为1时结果为1。
  • 异或(^):两位不同时结果为1。
  • 非(~):单目运算,按位取反。

Bitshift(位移运算):将二进制位整体左移或右移

  • 左移(<<):低位补0,相当于数值乘以2的n次方(如x << 1x*2)。
  • 右移(>>):高位补符号位(算术右移)或补0(逻辑右移),相当于除以2的n次方(向下取整)。

关系:位运算逐位处理数据,位移运算则是批量移动位的位置,两者常结合用于底层优化(如权限控制、快速计算)

实操

示例一

module net2dev_addr::Sample7 {
    /*
    BITWISE

    | OR - If either binary value is 1 return 1, else return 0
    & AND - If both binary values are 1 return 1, else return 0
    ^ XOR - If binary values are different return 1, else return 0

    value_a = 7
    value_b = 4

    7 | 4 = 7
    7 & 4 = 4
    7 ^ 4 = 3

    8 4 2 1

    0 1 1 1 = 7
    0 1 0 0 = 4
    0 0 1 1 = 3
    */

    fun bitwise_or(a: u64, b: u64): u64 {
        a | b
    }

    fun bitwise_and(a: u64, b: u64): u64 {
        a & b
    }

    fun bitwise_xor(a: u64, b: u64): u64 {
        a ^ b
    }

    #[test_only]
    use std::debug::print;

    #[test]
    fun test_bitwise_operators() {
        let result = bitwise_or(7, 4);
        print(&result);
        assert!(result == 7);

        let result = bitwise_and(7, 4);
        print(&result);
        assert!(result == 4);

        let result = bitwise_xor(7, 4);
        print(&result);
        assert!(result == 3);
    }
}


这段 Aptos Move 代码定义了一个名为 Sample7 的模块,用于演示基础的位运算 (bitwise operations)。它包含了三个独立的函数,分别用于执行按位或 (|)按位与 (&)按位异或 (^),每个函数都接收两个 u64 整数作为输入并返回相应的结果。该模块的全部功能由一个名为 test_bitwise_operators 的单元测试进行验证,该测试使用示例值 74 依次调用了这三个函数,并利用 assert! 语句来确认其计算结果与预期的 743 完全一致。

测试

➜ aptos move test
INCLUDING DEPENDENCY AptosFramework
INCLUDING DEPENDENCY AptosStdlib
INCLUDING DEPENDENCY MoveStdlib
BUILDING my-dapp
Running Move unit tests
[debug] 7
[debug] 4
[debug] 3
[ PASS    ] 0x48daaa7d16f1a59929ece03157b8f3e4625bc0a201988ac6fea9b38f50db5ef3::Sample7::test_bitwise_operators
Test result: OK. Total tests: 1; passed: 1; failed: 0
{
  "Result": "Success"
}

这个测试结果表明,你的 my-dapp 项目已成功通过了其单元测试。在成功编译项目后,测试框架执行了 Sample7 模块中定义的唯一一个测试函数 test_bitwise_operators。日志中的 [debug] 行清晰地打印出了 743 这三个值,它们分别是代码中按位或、按位与和按位异或运算的实际计算结果。紧随其后的 [ PASS ] 状态确认了该测试用例顺利完成,意味着其内部所有的 assert! 断言均已满足。最后,Test result: OK. Total tests: 1; passed: 1; failed: 0 的总结性陈述,为这次测试画上了圆满的句号,证明了你合约中的位运算逻辑完全正确。

示例二

module net2dev_addr::Sample7 {
    /*
    BITWISE

    | OR - If either binary value is 1 return 1, else return 0
    & AND - If both binary values are 1 return 1, else return 0
    ^ XOR - If binary values are different return 1, else return 0

    value_a = 7
    value_b = 4

    7 | 4 = 7
    7 & 4 = 4
    7 ^ 4 = 3

    8 4 2 1

    0 1 1 1 = 7
    0 1 0 0 = 4
    0 0 1 1 = 3
    */

    fun bitwise_or(a: u64, b: u64): u64 {
        a | b
    }

    fun bitwise_and(a: u64, b: u64): u64 {
        a & b
    }

    fun bitwise_xor(a: u64, b: u64): u64 {
        a ^ b
    }

    #[test_only]
    use std::debug::print;

    #[test]
    fun test_bitwise_operators() {
        let result = bitwise_or(7, 4);
        print(&result);
        assert!(result == 7);

        let result = bitwise_and(7, 4);
        print(&result);
        assert!(result == 4);

        let result = bitwise_xor(7, 4);
        print(&result);
        assert!(result == 3);
    }

    /*
    BITSHIFT

    to the right 7 >> 2 = 7 / 2^2 = 7 / 4 = 1
    to the left 7 << 2 = 7 * 2^2 = 7 * 4 = 28

    8 4 2 1
      1 1 1

    16 8 4 2 1
    1 1 1

    */

    fun bitshift_left(a: u64, times: u8): u64 {
        a << times
    }

    fun bitshift_right(a: u64, times: u8): u64 {
        a >> times
    }

    #[test]
    fun test_bitshift() {
        let result = bitshift_left(7, 2);
        print(&result);
        assert!(result == 28);

        let result = bitshift_right(7, 2);
        print(&result);
        assert!(result == 1);
    }
}


这段 Aptos Move 代码定义了一个 Sample7 模块,用于演示两种基本的底层位操作类别:按位运算 (bitwise)移位运算 (bitshift)。模块的第一部分提供了按位或 (|)、按位与 (&) 和按位异或 (^) 的函数。新增的第二部分则引入了左移 (<<)(效果相当于乘以2的幂)和右移 (>>)(效果相当于整除2的幂)的函数。所有这五种操作的正确性,都由两个独立的单元测试进行了充分验证,确保了按位和移位功能均能返回预期的结果。

测试

➜ aptos move test
INCLUDING DEPENDENCY AptosFramework
INCLUDING DEPENDENCY AptosStdlib
INCLUDING DEPENDENCY MoveStdlib
BUILDING my-dapp
Running Move unit tests
[debug] 28
[debug] 1
[ PASS    ] 0x48daaa7d16f1a59929ece03157b8f3e4625bc0a201988ac6fea9b38f50db5ef3::Sample7::test_bitshift
[debug] 7
[debug] 4
[debug] 3
[ PASS    ] 0x48daaa7d16f1a59929ece03157b8f3e4625bc0a201988ac6fea9b38f50db5ef3::Sample7::test_bitwise_operators
Test result: OK. Total tests: 2; passed: 2; failed: 0
{
  "Result": "Success"
}

这个测试结果表明,你的 my-dapp 项目已成功通过其全部单元测试。在成功编译项目后,测试框架执行了 Sample7 模块中的 test_bitshifttest_bitwise_operators 两个测试函数。日志中的 [debug] 行显示了代码的实际计算结果——281是移位运算的结果,743是按位运算的结果。每一条 [ PASS ] 记录都确认了这些计算结果与你 assert! 断言中的预期值完全相符。最后的摘要 Test result: OK. Total tests: 2; passed: 2; failed: 0 提供了明确的结论:所有测试均已通过,证明了你合约中的位操作逻辑是正确无误的。

总结

恭喜你!通过本篇实操,你已经掌握了 Aptos Move 中最基础也是最强大的底层操作——位运算与移位运算。我们不仅理解了它们的工作原理,还通过单元测试严格验证了每一行代码的正确性。

这些看似“硬核”的技巧,并非只是学术概念,它们在专业的智能合约开发中扮演着至关重要的角色:使用位运算来紧凑地管理复杂的状态和权限,利用移位运算来实现高效的乘除法……这些都是高级开发者优化 Gas、提升性能的必备技能。

现在,你已经将这些强大的工具收入囊中,为编写更专业、更高效的 Move 合约打下了坚实的基础。

参考