本篇文章主要讲讲Solidity中的按位运算,包括有:& | ^ ~ << >>。
-
&:按位与。1&1 = 1,1&0、0&1、0&0都为0; -
|:按位或。1|1、1|0、0|1都为1,0|0 = 0; -
^:按位异或。1^1和0^0为0,1^0和0^1为1; -
~:非运算。~0 = 1, ~1 = 0; -
<<:x << y 相当于 x * 2**y; -
>>:x >> y 相当于 x / 2**y;
来自Solidity by Example的例子:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract BitwiseOps {
// x = 1110 = 8 + 4 + 2 + 0 = 14
// y = 1011 = 8 + 0 + 2 + 1 = 11
// x & y = 1010 = 8 + 0 + 2 + 0 = 10
function and(uint256 x, uint256 y) external pure returns (uint256) {
return x & y;
}
// x = 1100 = 8 + 4 + 0 + 0 = 12
// y = 1001 = 8 + 0 + 0 + 1 = 9
// x | y = 1101 = 8 + 4 + 0 + 1 = 13
function or(uint256 x, uint256 y) external pure returns (uint256) {
return x | y;
}
// x = 1100 = 8 + 4 + 0 + 0 = 12
// y = 0101 = 0 + 4 + 0 + 1 = 5
// x ^ y = 1001 = 8 + 0 + 0 + 1 = 9
function xor(uint256 x, uint256 y) external pure returns (uint256) {
return x ^ y;
}
// x = 00001100 = 0 + 0 + 0 + 0 + 8 + 4 + 0 + 0 = 12
// ~x = 11110011 = 128 + 64 + 32 + 16 + 0 + 0 + 2 + 1 = 243
function not(uint8 x) external pure returns (uint8) {
return ~x;
}
// 1 << 0 = 0001 --> 0001 = 1
// 1 << 1 = 0001 --> 0010 = 2
// 1 << 2 = 0001 --> 0100 = 4
// 1 << 3 = 0001 --> 1000 = 8
// 3 << 2 = 0011 --> 1100 = 12
function shiftLeft(uint256 x, uint256 bits)
external
pure
returns (uint256)
{
return x << bits;
}
// 8 >> 0 = 1000 --> 1000 = 8
// 8 >> 1 = 1000 --> 0100 = 4
// 8 >> 2 = 1000 --> 0010 = 2
// 8 >> 3 = 1000 --> 0001 = 1
// 8 >> 4 = 1000 --> 0000 = 0
// 12 >> 1 = 1100 --> 0110 = 6
function shiftRight(uint256 x, uint256 bits)
external
pure
returns (uint256)
{
return x >> bits;
}
}
对于左移、右移运算:超出类型范围的bit,都会被移出去,另一边则移进去0。

注意点:
- 移位运算的结果具有左操作数的类型,截断结果以匹配类型。右操作数必须是无符号类型,尝试按有符号类型进行移位将产生编译错误。
- 只有整数类型和固定长度字节数组类型(bytes1、bytes2、…、bytes32)才能进行按位运算;
- 如果两者中的任何一个是小数,则不允许进行按位运算;
参考:https://docs.soliditylang.org/en/latest/types.html
2209

被折叠的 条评论
为什么被折叠?



