solidity智能合约[8]-位运算与字面量

位运算

solidity中,可以对于最底层的位进行操作。
由于以太坊中需要消耗gas,因此,为了节约gas、所以对于位的操作会用到比较频繁。
solidity中支持多种类型的位运算操作
1、位与 &
2、位或 |
3、位异或 ^
4、位取反 ~
5、<<
6、>>

数字3、4的二进制表示

数字3、4的底层表示

位与

位与

位或

位或

位异或

位异或

位取反

位取反

位左移

位左移

位右移

位右移

位运算例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
pragma solidity ^0.4.23;

contract weiTest{
uint8 a = 3;
uint8 b = 4;
function weiyu() public view returns(uint8){

return a &b;
}

function weihuo() public view returns(uint8){

return a |b;
}

function weiyihuo() public view returns(uint8){

return a^b;
}


function qufan() public view returns(uint8){
return ~a;
}

function leftMove() public view returns(uint8){
return a<<1;
}

function rightMove() public view returns(uint8){
return a>>1;
}
}

整型字面量

solidity在计算过程中的中间值,支持任意的精度,如小数。不会发生溢出操作。
只有在将计算结果赋值给特定类型的时候,才会发生截断溢出等操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//返回1
function TestInterger() public pure returns(uint8){
uint8 num = (2**800+1) - 2**800;
return num;
}
//返回50
function TestInterger2() public pure returns(uint8){
uint8 num = 2/4*100;
return num;
}
//返回1
function TestInterger3() public pure returns(uint8){
uint8 num =11111111111111111111111111111111111111111111112-11111111111111111111111111111111111111111111111;
return num;
}