往期回顾
- Solidity快速上手教程(一)—— HelloWorld_1.sol(读取链上数据)
- Solidity快速上手教程(二)—— HelloWorld_2.sol(修改链上数据,并读取)
- Solidity快速上手教程(三)—— 简单几种基本数据类型和认识结构体
- Solidity快速上手教程(四)—— 基础数据类型完整版&运算符
补充知识点
位运算
和算术运算符相比,位运算的开销更小些,直接对二进制做的计算。在Solidity中,有按位与、按位或、按位异或、按位取反、左移和右移操作。我们用 8 和 7 做前面三种位运算的演示。
8_{(10)} = 0000\ 1000_{(2)}
7_{(10)} = 0000\ 0111_{(2)}
底部角标表示进制
-
按位与:即从低位往高位,逐个逐个地做与操作。
- 0 & 0 = 0;
- 0 & 1 = 0;
- 1 & 0 = 0;
- 1 & 1 = 1;
- 所以 8_{(10)}\ \&\ 7_{(10)} = 0_{(10)} = 0000\ 0000_{(2)}
-
按位或:即从低位往高位,逐个逐个地做或操作。
- 0 | 0 = 0;
- 0 | 1 = 1;
- 1 | 0 = 1;
- 1 | 1 = 1;
- 所以 8_{(10)}\ |\ 7_{(10)} = 15_{(10)} = 0000\ 1111_{(2)}
-
按位异或:即从低位往高位,逐个逐个地做异或操作【同 0 异 1】。
- 0 ^ 0 = 0;
- 0 ^ 1 = 1;
- 1 ^ 0 = 1;
- 1 ^ 1 = 0;
- 所以 8_{(10)}\ \oplus\ 7_{(10)} = 15_{(10)} = 0000\ 1111_{(2)}
- 备注: \small\oplus 是数学公式里的异或符号,^\wedge 是计算机代码中的异或符号
-
按位取反:即从低位往高位,逐个逐个地做取反操作
- ~0 = 1;
- ~1 = 0;
- 所以 \sim 8_{(10)} = 1111\ 0111_{(2)}
-
按位左移:整体的向左边移动,低位补0。
- 所以 \sim 8_{(10)} = 0001\ 0000_{(2)} ,等于是 ×2
-
按位右移:整体的向右边移动,高位补0。
- 所以 \sim 8_{(10)} = 0000\ 0100_{(2)} ,等于是 /2
2022年7月5日14点11分补充代码
Solidity 位运算代码
pragma solidity ^0.4.26;
contract BaseType{
function bitAND(uint8 a, uint8 b) public pure returns(uint8){
return a & b;
}
function bitOR(uint8 a, uint8 b) public pure returns(uint8){
return a | b;
}
function bitXOR(uint8 a, uint8 b) public pure returns(uint8){
return a ^ b;
}
function bitNOT(uint8 a) public pure returns(uint8){
return ~a;
}
function bitLEFT(uint8 a) public pure returns(uint8){
return a << 1;
}
function bitRIGHT(uint8 a) public pure returns(uint8){
return a >> 1;
}
}