一、基础运算
一些加、减、乘、除、取余和平方等基础的运算,代码实现如下:
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。
②函数名相同,但是传递的参变量不同,函数也不相同。
本文介绍了使用Solidity编程语言实现基础数学运算和底层位运算的智能合约。通过示例展示了加、减、乘、除、取余、平方以及位与、位或、位异或、位移等操作。同时,讨论了整数溢出和异常处理,提供了代码检验以确保预期效果。
4681

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



