位运算符 #

一、位运算符概述 #

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