位运算符 #
一、位运算符概述 #
Solidity支持以下位运算符:
| 运算符 | 名称 | 示例 | 说明 |
|---|---|---|---|
| & | 按位与 | a & b | 两位都为1才为1 |
| | | 按位或 | a | b | 任一位为1即为1 |
| ^ | 按位异或 | a ^ b | 两位不同为1 |
| ~ | 按位取反 | ~a | 0变1,1变0 |
| << | 左移 | a << n | 左移n位 |
| >> | 右移 | a >> n | 右移n位 |
二、按位与 & #
solidity
contract BitwiseAnd {
function and(uint256 a, uint256 b) public pure returns (uint256) {
return a & b;
}
// 判断奇偶
function isEven(uint256 n) public pure returns (bool) {
return (n & 1) == 0;
}
// 检查是否是2的幂
function isPowerOfTwo(uint256 n) public pure returns (bool) {
return n > 0 && (n & (n - 1)) == 0;
}
// 提取低4位
function getLow4Bits(uint256 value) public pure returns (uint256) {
return value & 0xF;
}
}
三、按位或 | #
solidity
contract BitwiseOr {
function or(uint256 a, uint256 b) public pure returns (uint256) {
return a | b;
}
// 设置特定位
function setBit(uint256 value, uint8 position) public pure returns (uint256) {
return value | (1 << position);
}
}
四、按位异或 ^ #
solidity
contract BitwiseXor {
function xor(uint256 a, uint256 b) public pure returns (uint256) {
return a ^ b;
}
// 切换特定位
function toggleBit(uint256 value, uint8 position) public pure returns (uint256) {
return value ^ (1 << position);
}
// 交换两个变量
function swap(uint256 a, uint256 b) public pure returns (uint256, uint256) {
a = a ^ b;
b = a ^ b;
a = a ^ b;
return (a, b);
}
}
五、移位运算 #
5.1 左移 << #
solidity
contract LeftShift {
function leftShift(uint256 a, uint256 n) public pure returns (uint256) {
return a << n;
}
// 左移相当于乘以2的n次方
function multiplyByPowerOf2(uint256 a, uint8 n) public pure returns (uint256) {
return a << n;
}
// 快速乘以2
function multiplyBy2(uint256 a) public pure returns (uint256) {
return a << 1;
}
}
5.2 右移 >> #
solidity
contract RightShift {
function rightShift(uint256 a, uint256 n) public pure returns (uint256) {
return a >> n;
}
// 右移相当于除以2的n次方
function divideByPowerOf2(uint256 a, uint8 n) public pure returns (uint256) {
return a >> n;
}
// 快速除以2
function divideBy2(uint256 a) public pure returns (uint256) {
return a >> 1;
}
}
六、实际应用示例 #
6.1 权限管理 #
solidity
contract PermissionSystem {
uint256 public constant PERMISSION_READ = 1 << 0;
uint256 public constant PERMISSION_WRITE = 1 << 1;
uint256 public constant PERMISSION_DELETE = 1 << 2;
uint256 public constant PERMISSION_ADMIN = 1 << 3;
mapping(address => uint256) public userPermissions;
function grantPermission(address user, uint256 permission) public {
userPermissions[user] |= permission;
}
function revokePermission(address user, uint256 permission) public {
userPermissions[user] &= ~permission;
}
function hasPermission(address user, uint256 permission) public view returns (bool) {
return (userPermissions[user] & permission) == permission;
}
}
6.2 位图 #
solidity
contract Bitmap {
uint256 private bitmap;
function setBit(uint8 index) public {
require(index < 256, "Index out of range");
bitmap |= (1 << index);
}
function clearBit(uint8 index) public {
require(index < 256, "Index out of range");
bitmap &= ~(1 << index);
}
function isSet(uint8 index) public view returns (bool) {
require(index < 256, "Index out of range");
return (bitmap & (1 << index)) != 0;
}
}
七、总结 #
位运算符要点:
| 运算符 | 说明 | 常见用途 |
|---|---|---|
| & | 按位与 | 掩码、检查位 |
| | | 按位或 | 设置位、合并标志 |
| ^ | 按位异或 | 切换位、加密 |
| ~ | 按位取反 | 创建掩码 |
| << | 左移 | 乘以2的幂 |
| >> | 右移 | 除以2的幂 |
使用建议:
- 使用位运算优化乘除和取余
- 使用位图节省存储空间
- 使用位标志管理权限和状态
接下来,让我们学习控制流!
最后更新:2026-03-27