当前位置:网站首页>【Solidity智能合约基础】-- 基础运算与底层位运算
【Solidity智能合约基础】-- 基础运算与底层位运算
2022-08-02 14:14:00 【super阿真】
一、基础运算
一些加、减、乘、除、取余和平方等基础的运算,代码实现如下:
pragma solidity ^0.4.0;
contract math{
//int & uint
uint numa=4;
uint numb=2;
//uint8 numc=2;
function add(uint a,uint b)pure public returns(uint){
return a+b;
}
function jian(uint a,uint b)pure public returns(uint){
return a-b;
}
function cheng(uint a,uint b)pure public returns(uint){
return a*b;
}
function chu(uint a,uint b)pure public returns(uint){
return a/b;
}
function yu(uint a,uint b)pure public returns(uint){
return a%b;
}
function pingfang(uint a,uint b)pure public returns(uint){
return a**b;
}}
对代码运行结果进行检验 ,达到预期效果。
【注】:对于两个不同的函数,不能使用相同的函数名。
二、底层位运算
首先要明白一些二进制的基本原理,比如如下常识:
(1)二进制转化成十进制
以uint8为例,uint8中”uint“是指unsigned int,”8“指的是八位,uint8是8位无符号整型。
以下面两个uint8类型的二进制数为例,
可以很容易地算出,a = 2^1*1 + 2^0*1 = 3
b = 2^2*1 + 2^1*0 + 2^0*0 = 4
(2)位运算操作
两串数字的每一位都会进行的操作,得到新的一串数字对应的该位的数(0或1)
即:
“&” 与操作:双目运算符,两个都为1才为1,否则为0。
“|” 或操作:双目运算符,两个只要有1就为1,否则为0。
“-” 取反操作:单目,把指定数字串的1变成0,把0变成1。
“^” 异或操作:双目,相等为0,不等为1。(最容易让人犯迷糊)
“<<” 左移操作:单目,将”1“向该方向移,空出来的用”0“补,超过边界的去除。如<<1指的是所有的”1“向左移动一位。
“>>” 右移操作:同左移操作。向右移动一个单位表示为”>>1“。
图解如下:
在基础运算代码的基础上,进行了位运算的实现。
pragma solidity ^0.4.0;
contract math{
//int & uint
uint numa=4;
uint numb=2;
//uint8 numc=2;
function add(uint a,uint b)pure public returns(uint){
return a+b;
}
function jian(uint a,uint b)pure public returns(uint){
return a-b;
}
function cheng(uint a,uint b)pure public returns(uint){
return a*b;
}
function chu(uint a,uint b)pure public returns(uint){
return a/b;
}
function yu(uint a,uint b)pure public returns(uint){
return a%b;
}
function pingfang(uint a,uint b)pure public returns(uint){
return a**b;
}
//底层位运算
uint8 a=3;
uint8 b=4;
function weiyu() view public returns(uint){ //如果返回值是有变量的 ,则使用view,不能使用pure
return a & b;
}
function weihuo() view public returns(uint){
return a | b;
}
function weifan() view public returns(uint){
return a ^ b;
}
function zuoyi() view public returns(uint){
return a<<1;
}
function youyi() view public returns(uint){
return a>>1;
}
//危险的整数溢出和异常处理
function flow()view public returns(uint){
uint8 mm=255;
mm++;
return mm;
}
function flow2() view public returns(uint){
uint8 mm=0;
mm--;
return mm;
}
}
对代码运行结果进行检验 ,达到预期效果。
【注】①用pure的时候是不能访问状态变量的。可以把pure换成view。
②函数名相同,但是传递的参变量不同,函数也不相同。
边栏推荐
猜你喜欢
随机推荐
2021-06-06
Exotic curiosity-a solution looking - bit operations
2. Log out, log in state examination, verification code
光学好书推荐
Evaluate multipath BBR congestion control on ns3
flex布局
光波导应用中的真实光栅效应
深入理解负载均衡
2342. 数位和相等数对的最大和 哈希优化
分布式一致性协议-Paxos
字符数组/字符串数组|数组指针/指针数组/
快速排序
shader 和 ray marching
【数组】查表法(闰年)
Optisystem应用:光电检测器灵敏度建模
7. Redis
IDEA 单元测试报错:Class not found
unity 和C# 一些官方优化资料
win10无法识别蓝牙麦克风
Unity-存档与读档