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;
    }
}