AptosMove性能优化:位运算与移位操作实战在掌握了Move语言的高层逻辑后,一个专业的智能合约开发者还需要深入理解其底层操作,这正是实现极致性能和Gas优化的关键所在。位运算(Bitwise)与移位运算(Bitshift)作为程序语言中最接近硬件的指令,能让我们以最高效的方式处理
在掌握了 Move 语言的高层逻辑后,一个专业的智能合约开发者还需要深入理解其底层操作,这正是实现极致性能和 Gas 优化的关键所在。位运算(Bitwise)与移位运算(Bitshift)作为程序语言中最接近硬件的指令,能让我们以最高效的方式处理数据。
这篇实战教程将为你揭开位操作的神秘面纱。我们将通过清晰的代码示例和可验证的单元测试,手把手带你学习按位与、或、异或以及左右移位等核心操作。读完本文,你将获得一套强大的底层工具,并理解如何在 Move 中利用它们来编写更紧凑、更高效、更专业的代码。
x << 1
即x*2
)。 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
的单元测试进行验证,该测试使用示例值 7
和 4
依次调用了这三个函数,并利用 assert!
语句来确认其计算结果与预期的 7
、4
和 3
完全一致。
➜ 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]
行清晰地打印出了 7
、4
和 3
这三个值,它们分别是代码中按位或、按位与和按位异或运算的实际计算结果。紧随其后的 [ 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_bitshift
和 test_bitwise_operators
两个测试函数。日志中的 [debug]
行显示了代码的实际计算结果——28
和1
是移位运算的结果,7
、4
和3
是按位运算的结果。每一条 [ PASS ]
记录都确认了这些计算结果与你 assert!
断言中的预期值完全相符。最后的摘要 Test result: OK. Total tests: 2; passed: 2; failed: 0
提供了明确的结论:所有测试均已通过,证明了你合约中的位操作逻辑是正确无误的。
恭喜你!通过本篇实操,你已经掌握了 Aptos Move 中最基础也是最强大的底层操作——位运算与移位运算。我们不仅理解了它们的工作原理,还通过单元测试严格验证了每一行代码的正确性。
这些看似“硬核”的技巧,并非只是学术概念,它们在专业的智能合约开发中扮演着至关重要的角色:使用位运算来紧凑地管理复杂的状态和权限,利用移位运算来实现高效的乘除法……这些都是高级开发者优化 Gas、提升性能的必备技能。
现在,你已经将这些强大的工具收入囊中,为编写更专业、更高效的 Move 合约打下了坚实的基础。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!