• 关于 位运算() 的搜索结果

回答

数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,"正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过我们绝大多数人生来具有10个手指头这个解剖学事实的结果.尽管在历史上手指计数(5,10进制)的实践要比二或三进制计数出现的晚."(摘自<<数学发展史>>有空大家可以看看哦~,很有意思的).为了能方便的与二进制转换,就使用了十六进制(2 4)和八进制(23).下面进入正题. 数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8.即字长为1byte,原码能表示数值的范围为 (-127~-0 +0~127)共256个. ? 有了数值的表示方法就可以对数进行算术运算.但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如下: 假设字长为8bits ( 1 )?10-? ( 1 )10?=? ( 1 )10?+ ( -1 )10?= ?( 0 )10 (00000001)原?+ (10000001)原?= (10000010)原?= ( -2 )?显然不正确. ? 因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上,对除符号位外的其余各位逐位取反就产生了反码.反码的取值空间和原码相同且一一对应. 下面是反码的减法运算: ?( 1 )10?-? ( 1 )?10=? ( 1 )?10+ ( -1 )?10= ?( 0 )10 ?(00000001)?反+ (11111110)反?=? (11111111)反?=? ( -0 ) ?有问题. ( 1 )10?-? ( 2)10?=? ( 1 )10?+ ( -2 )10?= ?( -1 )10 (00000001)?反+ (11111101)反?=? (11111110)反?=? ( -1 )?正确 问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大). 于是就引入了补码概念. 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为: (-128~0~127)共256个. 注意:(-128)没有相对应的原码和反码, (-128) = (10000000) ?补码的加减运算如下: ( 1 )?10-? ( 1 )?10=? ( 1 )10?+ ( -1 )10?= ?( 0 )10 (00000001)补?+ (11111111)补?=? (00000000)补?= ( 0 )?正确 ( 1 )?10-? ( 2)?10=? ( 1 )10?+ ( -2 )10?= ?( -1 )10 (00000001)?补+ (11111110)?补=? (11111111)补?= ( -1 ) ?正确 ?? 所以补码的设计目的是: ???? ⑴使符号位能与有效值部分一起参加运算,从而简化运算规则. ⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计 ? 所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。看了上面这些大家应该对原码、反码、补码有了新的认识了吧。

游客886 2019-12-02 01:28:34 0 浏览量 回答数 0

回答

一、二进制数的表示法 二进制是计算技术中广泛采用的一种数制。二进制数是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。二进制数也是采用位置计数法,其位权是以2为底的幂。例如二进制数110.11,其权的大小顺序为2^2、2^1、2^0、2^-1、2^-2。对于有n位整数,m位小数的二进制数用加权系数展开式表示,可写为: (a(n-1)a(n-2)…a(-m))2=a(n-1)×2^(n-1)+a(n-2)×2^(n-2)+……+a(1)×2^1+a(0)×2^0+a(-1)×2^(-1)+a(-2)×2^(-2)+……+a(-m)×2^(-m) 二进制数一般可写为:(a(n-1)a(n-2)…a(1)a(0).a(-1)a(-2)…a(-m))2。 注意: 1.式中aj表示第j位的系数,它为0和1中的某一个数。 2.a(n-1)中的(n-1)为下标,输入法无法打出所以用括号括住,避免混淆。 3.2^2表示2的平方,以此类推。 【例1102】将二进制数111.01写成加权系数的形式。 解:(111.01)2=(1×2^2)+(1×2^1)+(1×2^0)+(0×2^-1)+(1×2^-2) 二、二进制数的加法和乘法运算 二进制数的算术运算的基本规律和十进制数的运算十分相似。最常用的是加法运算和乘法运算。 1. 二进制加法 有四种情况: 0+0=0 0+1=1 1+0=1 1+1=0 进位为1 【例1103】求 (1101)2+(1011)2 的和 解: 1 1 0 1 + 1 0 1 1 1 1 0 0 2. 二进制乘法 有四种情况: 0×0=0 1×0=0 0×1=0 1×1=1 【例1104】求 (1110)2 乘(101)2 之积 解: 1 1 1 0 × 1 0 1 1 1 1 0 0 0 0 0 + 1 1 1 0 1 0 0 0 1 1 0-------------------------买本书,推荐“二进制入门”

小旋风柴进 2019-12-02 01:27:37 0 浏览量 回答数 0

回答

RSA加密算法 该算法于1977年由美国麻省理工学院MIT(Massachusetts Institute of Technology)的Ronal Rivest,Adi Shamir和Len Adleman三位年轻教授提出,并以三人的姓氏Rivest,Shamir和Adlernan命名为RSA算法。该算法利用了数论领域的一个事实,那就是虽然把两个大质数相乘生成一个合数是件十分容易的事情,但要把一个合数分解为两个质数却十分困难。合数分解问题目前仍然是数学领域尚未解决的一大难题,至今没有任何高效的分解方法。与Diffie-Hellman算法相比,RSA算法具有明显的优越性,因为它无须收发双方同时参与加密过程,且非常适合于电子函件系统的加密。 RSA算法可以表述如下: (1) 密钥配制。假设m是想要传送的报文,现任选两个很大的质数p与q,使得: (12-1); 选择正整数e,使得e与(p-1)(q-1)互质;这里(p-1)(q-1)表示二者相乘。再利用辗转相除法,求得d,使得: (12-2); 其中x mod y是整数求余运算,其结果是x整除以y后剩余的余数,如5 mod 3 = 2。 这样得: (e,n),是用于加密的公共密钥,可以公开出去;以及 (d,n),是用于解密的专用钥匙,必须保密。 (2) 加密过程。使用(e,n)对明文m进行加密,算法为: (12-3); 这里的c即是m加密后的密文。 (3) 解密过程。使用(d,n)对密文c进行解密,算法为: (12-4); 求得的m即为对应于密文c的明文。 RSA算法实现起来十分简捷,据说英国的一位程序员只用了3行Perl程序便实现了加密和解密运算。 RSA算法建立在正整数求余运算基础之上,同时还保持了指数运算的性质,这一点我们不难证明。例如: (12-5); (12-6)。 RSA公共密钥加密算法的核心是欧拉(Euler)函数ψ。对于正整数n,ψ(n)定义为小于n且与n互质的正整数的个数。例如ψ(6) = 2,这是因为小于6且与6互质的数有1和5共两个数;再如ψ(7) = 6,这是因为互质数有1,2,3,5,6共6个。 欧拉在公元前300多年就发现了ψ函数的一个十分有趣的性质,那就是对于任意小于n且与n互质的正整数m,总有mψ(n) mod n = 1。例如,5ψ(6) mod 6 = 52 mod 6= 25 mod 6 =1。也就是说,在对n求余的运算下,ψ(n)指数具有周期性。 当n很小时,计算ψ(n)并不难,使用穷举法即可求出;但当n很大时,计算ψ(n)就十分困难了,其运算量与判断n是否为质数的情况相当。不过在特殊情况下,利用ψ函数的两个性质,可以极大地减少运算量。 性质1:如果p是质数,则ψ(p) = (p-1)。 性质2:如果p与q均为质数,则ψ(p·q) = ψ(p)·ψ(q) = (p-1)(q-1)。 RSA算法正是注意到这两条性质来设计公共密钥加密系统的,p与q的乘积n可以作为公共密钥公布出来,而n的因子p和q则包含在专用密钥中,可以用来解密。如果解密需要用到ψ(n),收信方由于知道因子p和q,可以方便地算出ψ(n) = (p-1)(q-1)。如果窃听者窃得了n,但由于不知道它的因子p与q,则很难求出ψ(n)。这时,窃听者要么强行算出ψ(n),要么对n进行因数分解求得p与q。然而,我们知道,在大数范围内作合数分解是十分困难的,因此窃密者很难成功。 有了关于ψ函数的认识,我们再来分析RSA算法的工作原理: (1) 密钥配制。设m是要加密的信息,任选两个大质数p与q,使得 ;选择正整数e,使得e与ψ(n) = (p-1)(q-1)互质。 利用辗转相除法,计算d,使得ed mod ψ(n) = ,即ed = kψ(n) +1,其中k为某一正整数。 公共密钥为(e,n),其中没有包含任何有关n的因子p和q的信息。 专用密钥为(d,n),其中d隐含有因子p和q的信息。 (2) 加密过程。使用公式(12-3)对明文m进行加密,得密文c。 (3) 解密过程。使用(d,n)对密文c进行解密,计算过程为: cd mod n = (me mod n)d mod n = med mod n = m(kψ(n) + 1) mod n = (mkψ(n) mod n)·(m mod n) = m m即为从密文c中恢复出来的明文。 例如,假设我们需要加密的明文代码信息为m = 14,则: 选择e = 3,p = 5,q = 11; 计算出n = p·q = 55,(p-1)(q-1) = 40,d = 27; 可以验证:(e·d) mod (p-1)(q-1) = 81 mod 40 = 1; 加密:c = me mod n = 143 mod 55 = 49; 解密:m = cd mod n = 4927 mod 55 = 14。 关于RSA算法,还有几点需要进一步说明: (1) 之所以要求e与(p-1)(q-1)互质,是为了保证 ed mod (p-1)(q-1)有解。 (2) 实际操作时,通常先选定e,再找出并确定质数p和q,使得计算出d后它们能满足公式(12-3)。常用的e有3和65537,这两个数都是费马序列中的数。费马序列是以17世纪法国数学家费马命名的序列。 (3) 破密者主要通过将n分解成p·q的办法来解密,不过目前还没有办法证明这是唯一的办法,也可能有更有效的方法,因为因数分解问题毕竟是一个不断发展的领域,自从RSA算法发明以来,人们已经发现了不少有效的因数分解方法,在一定程度上降低了破译RSA算法的难度,但至今还没有出现动摇RSA算法根基的方法。 (4) 在RSA算法中,n的长度是控制该算法可靠性的重要因素。目前129位、甚至155位的RSA加密勉强可解,但目前大多数加密程序均采用231、308甚至616位的RSA算法,因此RSA加密还是相当安全的。 据专家测算,攻破512位密钥RSA算法大约需要8个月时间;而一个768位密钥RSA算法在2004年之前无法攻破。现在,在技术上还无法预测攻破具有2048位密钥的RSA加密算法需要多少时间。美国Lotus公司悬赏1亿美元,奖励能破译其Domino产品中1024位密钥的RSA算法的人。从这个意义上说,遵照SET协议开发的电子商务系统是绝对安全的。

马铭芳 2019-12-02 01:26:59 0 浏览量 回答数 0

试用中心

为您提供0门槛上云实践机会,企业用户最高免费12个月

回答

拜托:老大,你的家庭作业也来问? 你自己学吧:下面是课文^ RSA加密算法 该算法于1977年由美国麻省理工学院MIT(Massachusetts Institute of Technology)的Ronal Rivest,Adi Shamir和Len Adleman三位年轻教授提出,并以三人的姓氏Rivest,Shamir和Adlernan命名为RSA算法。该算法利用了数论领域的一个事实,那就是虽然把两个大质数相乘生成一个合数是件十分容易的事情,但要把一个合数分解为两个质数却十分困难。合数分解问题目前仍然是数学领域尚未解决的一大难题,至今没有任何高效的分解方法。与Diffie-Hellman算法相比,RSA算法具有明显的优越性,因为它无须收发双方同时参与加密过程,且非常适合于电子函件系统的加密。 RSA算法可以表述如下: (1) 密钥配制。假设m是想要传送的报文,现任选两个很大的质数p与q,使得: (12-1); 选择正整数e,使得e与(p-1)(q-1)互质;这里(p-1)(q-1)表示二者相乘。再利用辗转相除法,求得d,使得: (12-2); 其中x mod y是整数求余运算,其结果是x整除以y后剩余的余数,如5 mod 3 = 2。 这样得: (e,n),是用于加密的公共密钥,可以公开出去;以及 (d,n),是用于解密的专用钥匙,必须保密。 (2) 加密过程。使用(e,n)对明文m进行加密,算法为: (12-3); 这里的c即是m加密后的密文。 (3) 解密过程。使用(d,n)对密文c进行解密,算法为: (12-4); 求得的m即为对应于密文c的明文。 RSA算法实现起来十分简捷,据说英国的一位程序员只用了3行Perl程序便实现了加密和解密运算。 RSA算法建立在正整数求余运算基础之上,同时还保持了指数运算的性质,这一点我们不难证明。例如: (12-5); (12-6)。 RSA公共密钥加密算法的核心是欧拉(Euler)函数ψ。对于正整数n,ψ(n)定义为小于n且与n互质的正整数的个数。例如ψ(6) = 2,这是因为小于6且与6互质的数有1和5共两个数;再如ψ(7) = 6,这是因为互质数有1,2,3,5,6共6个。 欧拉在公元前300多年就发现了ψ函数的一个十分有趣的性质,那就是对于任意小于n且与n互质的正整数m,总有mψ(n) mod n = 1。例如,5ψ(6) mod 6 = 52 mod 6= 25 mod 6 =1。也就是说,在对n求余的运算下,ψ(n)指数具有周期性。 当n很小时,计算ψ(n)并不难,使用穷举法即可求出;但当n很大时,计算ψ(n)就十分困难了,其运算量与判断n是否为质数的情况相当。不过在特殊情况下,利用ψ函数的两个性质,可以极大地减少运算量。 性质1:如果p是质数,则ψ(p) = (p-1)。 性质2:如果p与q均为质数,则ψ(p·q) = ψ(p)·ψ(q) = (p-1)(q-1)。 RSA算法正是注意到这两条性质来设计公共密钥加密系统的,p与q的乘积n可以作为公共密钥公布出来,而n的因子p和q则包含在专用密钥中,可以用来解密。如果解密需要用到ψ(n),收信方由于知道因子p和q,可以方便地算出ψ(n) = (p-1)(q-1)。如果窃听者窃得了n,但由于不知道它的因子p与q,则很难求出ψ(n)。这时,窃听者要么强行算出ψ(n),要么对n进行因数分解求得p与q。然而,我们知道,在大数范围内作合数分解是十分困难的,因此窃密者很难成功。 有了关于ψ函数的认识,我们再来分析RSA算法的工作原理: (1) 密钥配制。设m是要加密的信息,任选两个大质数p与q,使得 ;选择正整数e,使得e与ψ(n) = (p-1)(q-1)互质。 利用辗转相除法,计算d,使得ed mod ψ(n) = ,即ed = kψ(n) +1,其中k为某一正整数。 公共密钥为(e,n),其中没有包含任何有关n的因子p和q的信息。 专用密钥为(d,n),其中d隐含有因子p和q的信息。 (2) 加密过程。使用公式(12-3)对明文m进行加密,得密文c。 (3) 解密过程。使用(d,n)对密文c进行解密,计算过程为: cd mod n = (me mod n)d mod n = med mod n = m(kψ(n) + 1) mod n = (mkψ(n) mod n)·(m mod n) = m m即为从密文c中恢复出来的明文。 例如,假设我们需要加密的明文代码信息为m = 14,则: 选择e = 3,p = 5,q = 11; 计算出n = p·q = 55,(p-1)(q-1) = 40,d = 27; 可以验证:(e·d) mod (p-1)(q-1) = 81 mod 40 = 1; 加密:c = me mod n = 143 mod 55 = 49; 解密:m = cd mod n = 4927 mod 55 = 14。 关于RSA算法,还有几点需要进一步说明: (1) 之所以要求e与(p-1)(q-1)互质,是为了保证 ed mod (p-1)(q-1)有解。 (2) 实际操作时,通常先选定e,再找出并确定质数p和q,使得计算出d后它们能满足公式(12-3)。常用的e有3和65537,这两个数都是费马序列中的数。费马序列是以17世纪法国数学家费马命名的序列。 (3) 破密者主要通过将n分解成p·q的办法来解密,不过目前还没有办法证明这是唯一的办法,也可能有更有效的方法,因为因数分解问题毕竟是一个不断发展的领域,自从RSA算法发明以来,人们已经发现了不少有效的因数分解方法,在一定程度上降低了破译RSA算法的难度,但至今还没有出现动摇RSA算法根基的方法。 (4) 在RSA算法中,n的长度是控制该算法可靠性的重要因素。目前129位、甚至155位的RSA加密勉强可解,但目前大多数加密程序均采用231、308甚至616位的RSA算法,因此RSA加密还是相当安全的。 据专家测算,攻破512位密钥RSA算法大约需要8个月时间;而一个768位密钥RSA算法在2004年之前无法攻破。现在,在技术上还无法预测攻破具有2048位密钥的RSA加密算法需要多少时间。美国Lotus公司悬赏1亿美元,奖励能破译其Domino产品中1024位密钥的RSA算法的人。从这个意义上说,遵照SET协议开发的电子商务系统是绝对安全的。

云篆 2019-12-02 01:26:48 0 浏览量 回答数 0

回答

函数内部对可变参数都用va_list及与它相关的三个宏来处理,这是实现变参参数的关键之处。 在中可以找到va_list的定义: typedef char * va_list; 再介绍与它关系密切的三个宏要介绍下:va_start(),va_end()和va_arg()。 同样在中可以找到这三个宏的定义: #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) #define va_end(ap) ( ap = (va_list)0 ) #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) 其中用到的_INTSIZEOF宏定义如下: #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) 来分析这四个宏: va_end(ap)这个最简单,就是将指针置成NULL。 va_start(ap,v)中ap = (va_list)&v + _INTSIZEOF(v)先是取v的地址,再加上_INTSIZEOF(v)。_INTSIZEOF(v)就有点小复杂了。( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )全是位操作,看起来有点麻烦,其实不然,非常简单的,就是取整到sizeof(int)。比如sizeof(int)为4,1,2,3,4就取4,5,6,7,8就取8。对x向n取整用C语言的算术表达就是((x+n-1)/n)*n,当n为2的幂时可以将最后二步运算换成位操作——将最低 n - 1个二进制位清 0就可以了。 va_arg(ap,t)就是从ap中取出类型为t的数据,并将指针相应后移。如va_arg(ap, int)就表示取出一个int数据并将指针向移四个字节。 因此在函数中先用va_start()得到变参的起始地址,再用va_arg()一个一个取值,最后再用va_end()收尾就可以解析可变参数了。

a123456678 2019-12-02 02:01:46 0 浏览量 回答数 0

问题

关于按位与在这个程序的的实际意义

蛮大人123 2019-12-01 20:26:46 802 浏览量 回答数 1

回答

用位运算就行了。3个字节,24位。5位来存日,2的5次方=32,存日可以了;同理,用4位来存月,剩下的15位来存年。刚开始把日期截成年、月、日,分别转成整型,然后申请3个字节的内存,再用位移和or操作就可以了###### 最大23位就可以存下.... 9999-12-31 : 10011100001111 1100 11111 System.out.println(Integer.toBinaryString(2018));//11111100010 System.out.println(Integer.toBinaryString(4));//100 System.out.println(Integer.toBinaryString(9));//1001  存的时候你就位移和逻辑运算就行了.###### 可否限制时间字符串中的年份在 [1782-2127] ? 若可以的话,byte数组的三个元素分别代表:年份、月份、和日, 只是年份以2000为准,用正负表示:比如,用 -10 表示 1990。###### 简单的写了一下,参见: https://blog.xdemo.cn/java-8date-story-3bytes/###### 看了大神给的思路,给弄出来了,感谢大神 存值: public byte[] StringToByte(String date) { int i, year, month, day; year = Integer.parseInt(date.substring(0, 4)); year = year << 9; month = Integer.parseInt(date.substring(4, 6)); month = month << 5; day = Integer.parseInt(date.substring(6)); i = year | month | day; byte[] data = new byte[3]; data[2] = (byte) (i & 0xFF); data[1] = (byte) ((i >> 8) & 0xFF); data[0] = (byte) ((i >> 16) & 0xFF); return data; } 取值: public String ByteToString(byte[] data) { int year, month, day; day = data[2] & 0x1F; month = (((data[1] << 3) & 0xF) | ((data[2] >> 5) & 0x7)) & 0xF; year = (data[0] << 7) | ((data[1] >> 1) & 0x7F); String date = new String(Integer.toString(year)); date.concat(Integer.toString(day)); if (month < 10) { date = date.concat("0").concat(Integer.toString(month)); } else { date = date.concat(Integer.toString(month)); } if (day < 10) { date = date.concat("0").concat(Integer.toString(day)); } else { date = date.concat(Integer.toString(day)); } return date; }  

kun坤 2020-06-06 23:07:42 0 浏览量 回答数 0

回答

1、二进制的加法法则: 二进制的基数是2,进位规则是“逢2进1”故加法运算法则为: (1)0+0=0 (2)0+1=1 1+0=1 (3)1+1=10(本位的0向高位进1) 2、二进制的乘法法则: (1)0x0=0 (2)1x0=0,0x1=0 (3)1x1=1-------------------------二进制乘法和加法都是通过对二进制数的移位来实现的,移位相当于×2,计算机算根据给出的加法式子与乘法式子算要移多少位。 扩展: 1、二进制数据的表示法   二进制数据也是采用位置计数法,其位权是以2为底的幂。例如二进制数据110.11,其权的大小顺序为2^2、2^1、2^0、2^-1、2^-2。对于有n位整数,m位小数的二进制数据用加权系数展开式表示,可写为:   (a(n-1)a(n-2)…a(-m))2=a(n-1)×2^(n-1)+a(n-2)×2^(n-2)+……+a(1)×2^1+a(0)×2^0+a(-1)×2^(-1)+a(-2)×2^(-2)+……+a(-m)×2^(-m)   二进制数据一般可写为:(a(n-1)a(n-2)…a(1)a(0).a(-1)a(-2)…a(-m))2。   注意:   1.式中aj表示第j位的系数,它为0和1中的某一个数。   2.a(n-1)中的(n-1)为下标,输入法无法打出所以用括号括住,避免混淆。   3.2^2表示2的平方,以此类推。   【例1102】将二进制数据111.01写成加权系数的形式。   解:(111.01)2=(1×2^2)+(1×2^1)+(1×2^0)+(0×2^-1)+(1×2^-2)   二进制和十六进制,八进制一样,都以二的幂来进位的。   二进制数据的算术运算的基本规律和十进制数的运算十分相似。最常用的是加法运算和乘法运算。   1. 二进制加法   有四种情况: 0+0=0   0+1=1   1+0=1   1+1=10 进位为1   【例1103】求 (1101)2+(1011)2 的和   解:   1 1 0 1   + 1 0 1 1   -------------------   1 1 0 0 0   2. 二进制乘法   有四种情况: 0×0=0   1×0=0   0×1=0   1×1=1   【例1104】求 (1110)2 乘(101)2 之积   解:   1 1 1 0   ×  1 0 1   -----------------------    1 1 1 0    0 0 0 0   1 1 1 0   -------------------------   1 0 0 0 1 1 0   (这些计算就跟十进制的加或者乘法相同,只是进位的数不一样而已,十进制的是到十才进位这里是到2就进了)   3.二进制减法   0-0=0,1-0=1,1-1=0,10-1=1。   4.二进制除法   0÷1=0,1÷1=1。[1][2]   5.二进制拈加法   拈加法二进制加减乘除外的一种特殊算法。   拈加法运算与进行加法类似,但不需要做进位。此算法在博弈论(Game Theory)中被广泛利用。   十进制数转换为二进制数、八进制数、十六进制数的方法:   二进制数、八进制数、十六进制数转换为十进制数的方法:按权展开求和法   1.二进制与十进制间的相互转换:   (1)二进制转十进制   方法:“按权展开求和”   例: (1011.01)2 =(1×2^3+0×2^2+1×2^1+1×2^0+0×2^(-1)+1×2^(-2) )10   =(8+0+2+1+0+0.25)10   =(11.25)10   规律:个位上的数字的次数是0,十位上的数字的次数是1,......,依奖递增,而十   分位的数字的次数是-1,百分位上数字的次数是-2,......,依次递减。   注意:不是任何一个十进制小数都能转换成有限位的二进制数。   (2)十进制转二进制   · 十进制整数转二进制数:“除以2取余,逆序排列”(除二取余法)   例: (89)10 =(1011001)2   2 89 ……1   2 44 ……0   2 22 ……0   2 11 ……1   2 5 ……1   2 2 ……0   1   · 十进制小数转二进制数:“乘以2取整,顺序排列”(乘2取整法)   例: (0.625)10= (0.101)2   0.625X2=1.25 ……1   0.25 X2=0.50 ……0   0.50 X2=1.00 ……1   2.八进制与二进制的转换:   二进制数转换成八进制数:从小数点开始,整数部分向左、小数部分向右,每3位为一组用一位八进制数的数字表示,不足3位的要用“0”补足3位,就得到一个八进制数。   八进制数转换成二进制数:把每一个八进制数转换成3位的二进制数,就得到一个二进制数。   八进制数字与二进制数字对应关系如下:   000 -> 0 100 -> 4   001 -> 1 101 -> 5   010 -> 2 110 -> 6   011 -> 3 111 -> 7   例:将八进制的37.416转换成二进制数:   3 7 . 4 1 6   011 111 .100 001 110   即:(37.416)8 =(11111.10000111)2   例:将二进制的10110.0011 转换成八进制:   0 1 0 1 1 0 . 0 0 1 1 0 0   2 6 . 1 4   即:(10110.011)2 = (26.14)8   3.十六进制与二进制的转换:   二进制数转换成十六进制数:从小数点开始,整数部分向左、小数部分向右,每4位为一组用一位十六进制数的数字表示,不足4位的要用“0”补足4位,就得到一个十六进制数。   十六进制数转换成二进制数:把每一个十六进制数转换成4位的二进制数,就得到一个二进制数。   十六进制数字与二进制数字的对应关系如下:   0000 -> 0 0100 -> 4 1000 -> 8 1100 -> C   0001 -> 1 0101 -> 5 1001 -> 9 1101 -> D   0010 -> 2 0110 -> 6 1010 -> A 1110 -> E   0011 -> 3 0111 -> 7 1011 -> B 1111 -> F   例:将十六进制数5DF.9 转换成二进制:   5 D F . 9   0101 1101 1111 .1001   即:(5DF.9)16 =(10111011111.1001)2   例:将二进制数1100001.111 转换成十六进制:   0110 0001 . 1110   6 1 . E   即:(1100001.111)2 =(61.E)16-------------------------1. 二进制加法 有四种情况: 0+0=0 0+1=1 1+0=1 1+1=0 进位为1 【例1103】求 (1101)2+(1011)2 的和 解: 1 1 0 1 + 1 0 1 1 1 1 0 0 0 2. 二进制乘法 有四种情况: 0×0=0 1×0=0 0×1=0 1×1=1 【例1104】求 (1110)2 乘(101)2 之积 解: 1 1 1 0 × 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0

游客886 2019-12-02 01:28:26 0 浏览量 回答数 0

回答

很多编程语言(包括js,但不包括php)基于性能考虑,对逻辑运算有个优化 对And运算 a = b && c, a的值为:如果b逻辑上为真,返回c; 否则返回b对Or运算 a = b || c, a的值为: 如果b逻辑上为真,返回b; 否则返回c给几个例子 a = 1 && 2; // 1a = null && 2; // nulla = 'str' || 2; // 'str'a = undefined || 2; // 2其实使用下面的例子可以更直观表现 function c() { console.log('这里不会调用'); }a = null && c(); // a 为 null因为&&前面为假,所以直接返回null,后面的函数c()不会被调用。 (原理我就不细说了,知道是性能优化就够了。如果你是计算机专业出身,上理论课时候肯定讲过,只不过当时可能没认真听。) 以下是针对PHP的原答案正好有时间,我就细说下。 首先 and or && || 都是逻辑运算符,功能完全相同,唯一区别只有优先级: && || > 赋值运算符(=) > and or; 你的测试代码里有个不太明显的坑。因为优先级:|| > = > or, 所以 $p = 6 or 0;实际上的运算顺序是 ($p = 6) or 0; // $p 为 6如果改成 $p = (6 or 0); // $p 为 true就和使用||一致了。 2、而 & | 是位运算符,和上面的不是一种运算。位运算符是将数字的每一位相应进行逻辑运算得出的结果,比如 $b = (10 | 12); // $b 为 1410(二进制为1010)和12(二进制1100)位与运算,得到14(二进制1110)

a123456678 2019-12-02 02:05:06 0 浏览量 回答数 0

问题

位运算函数是什么?

nicenelly 2019-12-01 21:26:37 1325 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 ABS 命令格式如下: Double abs(Double number) Bigint abs(Bigint number) Decimal abs(Decimal number) 命令说明如下: 该函数用于返回number的绝对值。 参数说明: number:当number为Double、Bigint或Decimal类型时。 输入为Bigint,返回Bigint。 输入为Double,返回Double类型。 输入为Decimal,返回Decimal类型。 若输入为String类型,会隐式转换为Double类型后参与运算,其它类型抛异常。 返回值: 返回Double、Bigint或Decimal类型,取决于输入参数的类型。若输入为null,则返回null。 说明 当输入Bigint类型的值超过Bigint的最大表示范围时,会返回Double类型,这种情况下可能会损失精度。 示例如下: abs(null)=null abs(-1)=1 abs(-1.2)=1.2 abs("-2")=2.0 abs(122320837456298376592387456923748)=1.2232083745629837e32 下面是一个完整的ABS函数在SQL中使用的示例,其他内建函数(除窗口函数、聚合函数外)的使用方式与其类似,不再举例。 select abs(id) from tbl1; -- 取tbl1表内id字段的绝对值 ACOS 命令格式如下: Double acos(Double number) Decimal acos(Decimal number) 命令说明如下: 该函数用于计算number的反余弦函数。 参数说明: number:Double类型或Decimal类型,-1 ≤ number ≤1。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型,值域在0 ~ π之间。若number为null,则返回null。 示例如下: acos("0.87")=0.5155940062460905 acos(0)=1.5707963267948966 ASIN 命令格式如下: Double asin(Double number) Decimal asin(Decimal number) 命令说明如下: 该函数用于计算number的反正弦函数。 参数说明: number:Double类型或Decimal类型,-1 ≤ number ≤1。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型,值域在-π/2 ~π/2之间。若number为null,返回null。 示例如下: asin(1)=1.5707963267948966 asin(-1)=-1.5707963267948966 ATAN 命令格式如下: Double atan(Double number) 命令说明如下: 该函数用于计算number的反正切函数。 参数说明: number:Double类型,若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型,值域在-π/2~π/2之间。若number为null,则返回null。 示例如下: atan(1)=0.7853981633974483 atan(-1)=-0.7853981633974483 CEIL 命令格式如下: Bigint ceil(Double value) Bigint ceil(Decimal value) 命令说明如下: 向上取整,函数返回不小于输入值value的最小整数。 参数说明: value:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Bigint类型。任意一个参数输入为null,则返回null。 示例如下: ceil(1.1)=2 ceil(-1.1)=-1 CONV 命令格式如下: String conv(String input, Bigint from_base, Bigint to_base) 命令说明如下: 该函数为进制转换函数。 参数说明: input:以String表示的要转换的整数值,接受Bigint、Double的隐式转换。 from_base、to_base:以十进制表示的进制的值,可接受的的值为2、8、10和16。接受String及Double的隐式转换。 返回值: 返回String类型。任意一个参数输入为null,返回null。转换过程以64位精度工作,溢出时报异常。输入如果是负值,即以(-)开头,报异常。如果输入的是小数,则会转为整数值后进行进制转换,小数部分会被舍弃。 示例如下: conv('1100', 2, 10)='12' conv('1100', 2, 16)='c' conv('ab', 16, 10)='171' conv('ab', 16, 16)='ab' COS 命令格式如下: Double cos(Double number) Decimal cos(Decimal number) 命令说明如下: 该函数用于计算number的余弦函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 示例如下: cos(3.1415926/2)=2.6794896585028633e-8 cos(3.1415926)=-0.9999999999999986 COSH 命令格式如下: Double cosh(Double number) Decimal cosh(Decimal number) 命令说明如下: 该函数用于计算number的双曲余弦函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后,参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,返回null。 COT 命令格式如下: Double cot(Double number) Decimal cot(Decimal number) 命令说明如下: 该函数用于计算number的余切函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 EXP 命令格式如下: Double exp(Double number) Decimal exp(Decimal number) 命令说明如下: 该函数用于计算number的指数函数。 返回值: 返回number的指数值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 FLOOR 命令格式如下: Bigint floor(Double number) Bigint floor(Decimal number) 命令说明如下: 向下取整,函数返回不大于number的最大整数值。 参数说明: number:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Bigint类型。若number为null,则返回null。 示例如下: floor(1.2)=1 floor(1.9)=1 floor(0.1)=0 floor(-1.2)=-2 floor(-0.1)=-1 floor(0.0)=0 floor(-0.0)=0 LN 命令格式如下: Double ln(Double number) Decimal ln(Decimal number) 命令说明如下: 该函数用于返回number的自然对数。 参数说明: number:Double类型或Decimal类型。 若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 若number为null,则返回null。若number为负数或零,则执行报错。 返回值: 返回Double类型或Decimal类型。 LOG 命令格式如下: Double log(Double base, Double x) Decimal log(Decimal base, Decimal x) 命令说明如下: 该函数用于返回以base为底的x的对数。 参数说明: base:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 x:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型的对数值。 若base和x中存在null,则返回null。 若base和x中某一个值为负数或 0,会引发异常。 若base为1(会引发一个除零行为),也会引发异常。 POW 命令格式如下: Double pow(Double x, Double y) Decimal pow(Decimal x, Decimal y) 命令说明如下: 该函数用于返回x的y次方,即x^y。 参数说明: X:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Y:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若x或y为null,则返回null。 RAND 命令格式如下: Double rand(Bigint seed) 命令说明如下: 该函数以seed为种子,返回Double类型的随机数,返回值区间是的0~1。 参数说明: seed:可选参数,Bigint类型,随机数种子,决定随机数序列的起始值。 返回值: 返回Double类型。 示例如下: select rand() from dual; select rand(1) from dual; ROUND 命令格式如下: Double round(Double number, [Bigint Decimal_places]) Decimal round(Decimal number, [Bigint Decimal_places]) 命令说明如下: 该函数四舍五入到指定小数点位置。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Decimal_place:Bigint类型常量,四舍五入计算到小数点后的位置,其他类型参数会引发异常。如果省略表示四舍五入到个位数,默认值为0。 返回值: 返回Double类型或Decimal类型。若number或Decimal_places为null,则返回null。 说明 Decimal_places可以是负数。负数会从小数点向左开始计数,并且不保留小数部分。如果Decimal_places超过了整数部分长度,返回0。 示例如下: round(125.315)=125.0 round(125.315, 0)=125.0 round(125.315, 1)=125.3 round(125.315, 2)=125.32 round(125.315, 3)=125.315 round(-125.315, 2)=-125.32 round(123.345, -2)=100.0 round(null)=null round(123.345, 4)=123.345 round(123.345, -4)=0.0 SIN 命令格式如下所示: Double sin(Double number) Decimal sin(Decimal number) 命令说明如下: 该函数用于计算number的正弦函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 SINH 命令格式如下: Double sinh(Double number) Decimal sinh(Decimal number) 命令说明如下: 该函数用于计算number的双曲正弦函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 SQRT 命令格式如下: Double sqrt(Double number) Decimal sqrt(Decimal number) 命令说明如下: 该函数用于计算number的平方根。 参数说明: number:Double类型或Decimal类型,必须大于0,小于0时引发异常。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TAN 命令说明如下: Double tan(Double number) Decimal tan(Decimal number) 命令说明如下: 该函数用于计算number的正切函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TANH 命令格式如下: Double tanh(Double number) Decimal tanh(Decimal number) 命令说明如下: 该函数用于计算number的双曲正切函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TRUNC 命令格式如下: Double trunc(Double number[, Bigint Decimal_places]) Decimal trunc(Decimal number[, Bigint Decimal_places]) 命令说明如下: 该函数用于将输入值number截取到指定小数点位置。 参数说明: number:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Decimal_places:Bigint类型常量,要截取到的小数点位置,其他类型参数会隐式转为Bigint,省略此参数时默认到截取到个位数。 返回值: 返回值类型为Double或Decimal类型。若number或Decimal_places为null,则返回null。 说明 返回Double类型时,返回的结果的显示可能不符合预期,如示例trunc(125.815, 1)(这个Double类型显示问题任何系统都存在)。 截取掉的部分补0。 Decimal_places可以是负数,负数会从小数点向左开始截取,并且不保留小数部分。如果Decimal_places超过了整数部分长度,则返回0。 示例如下: trunc(125.815)=125.0 trunc(125.815,0)=125.0 trunc(125.815,1)=125.80000000000001 trunc(125.815,2)=125.81 trunc(125.815,3)=125.815 trunc(-125.815,2)=-125.81 trunc(125.815,-1)=120.0 trunc(125.815,-2)=100.0 trunc(125.815,-3)=0.0 trunc(123.345,4)=123.345 trunc(123.345,-4)=0.0 MaxCompute2.0扩展函数 升级到MaxCompute2.0后,产品扩展部分数学函数,新函数若用到新数据类型时,在使用新函数的SQL前,需要加一个set语句: set odps.sql.type.system.odps2=true; 下文将为您详细介绍新扩展的函数。 LOG2 命令格式如下: Double log2(Double number) Double log2(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于以2为底,返回number的对数。 参数说明: number:Double或Decimal类型。 返回值: 返回Double类型。若输入为0或null,则返回null。 示例如下: log2(null)=null log2(0)=null log2(8)=3.0 LOG10 命令格式如下: Double log10(Double number) Double log10(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于以10为底,返回number的对数。 参数说明: number:Double或Decimal类型。 返回值: 返回Double类型。若输入为0或null,则返回null。 示例如下: log10(null)=null log10(0)=null log10(8)=0.9030899869919435 BIN 命令格式如下: String bin(Bigint number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回number的二进制代码表示。 参数说明: number:Bigint类型。 返回值: 返回String类型。若输入为0,返回0,输入为null,则返回null。 示例如下: bin(0)='0' bin(null)='null' bin(12)='1100' HEX 命令格式如下: String hex(Bigint number) String hex(String number) String hex(BINARY number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将整数或字符转换为十六进制格式。 参数说明: number:如果number是Bigint类型,那么返回number的十六进制表示。如果变量是String类型,则返回该字符串的十六进制表示。 返回值: 返回String类型。若输入为0,返回0,输入为null,则返回异常。 示例如下: hex(0)=0 hex('abc')='616263' hex(17)='11' hex('17')='3137' hex(null)异常返回失败 说明 当输入参数为Binary类型时,请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 UNHEX 命令格式如下: BINARY unhex(String number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回十六进制字符串所代表的字符串。 参数说明: number:为十六进制字符串。 返回值: 返回Binary类型,若输入0,返回失败,若输入为null,则返回null。 示例如下: unhex('616263')='abc' unhex(616263)='abc' RADIANS 命令格式如下: Double radians(Double number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将角度转换为弧度。 参数说明: number:Double类型数据。 返回值: 返回Double类型,若输入为null,返回null。 示例如下: radians(90)=1.5707963267948966 radians(0)=0.0 radians(null)=null DEGREES 命令格式如下: Double degrees(Double number) Double degrees(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将弧度转换为角度。 参数说明: number:Double或Decimal类型数据。 返回值: 返回Double类型,若输入null,则返回null。 示例如下: degrees(1.5707963267948966)=90.0 degrees(0)=0.0 degrees(null)=null SIGN 命令格式如下: Double sign(Double number) Double sign(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于取输入数据的符号,1.0表示正,-1.0表示负,否则0.0。 参数说明: number:Double或Decimal类型数据。 返回值: 返回Double类型,若输入0,则返回0.0,输入为null,则返回null。 示例如下: sign(-2.5)=-1.0 sign(2.5)=1.0 sign(0)=0.0 sign(null)=null E 命令格式如下: Double e() 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回e的值。 返回值: 返回Double类型。 示例如下: e()=2.718281828459045 PI 命令格式如下: Double pi() 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回π的值。 返回值: 返回Double类型。 示例如下: pi()=3.141592653589793 FACTORIAL 命令格式如下: Bigint factorial(Int number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回number的阶乘。 参数说明: number:Int类型数据,且在[0..20]之间。 返回值: 返回Bigint类型,输入为0,则返回1,输入为null或[0..20]之外的值,返回null。 示例如下: factorial(5)=120 --5!=5*4*3*2*1=120 CBRT 命令格式如下: Double cbrt(Double number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于计算number的立方根。 参数说明: number:Double类型数据。 返回值: 返回Double类型,输入为null,返回null。 示例如下: cbrt(8)=2 cbrt(null)=null SHIFTLEFT 命令格式如下: Int shiftleft(Tinyint|Smallint|Int number1, Int number2) Bigint shiftleft(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于按位左移(<<)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bingint类型。 示例如下: shiftleft(1,2)=4 --1的二进制左移2位(1<<2,0001左移两位是0100) shiftleft(4,3)=32 --4的二进制左移3位(4<<3,0100左移3位是100000) SHIFTRIGHT 命令格式如下: Int shiftright(Tinyint|Smallint|Int number1, Int number2) Bigint shiftright(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于按位右移(>>)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bigint类型。 示例如下: shiftright(4,2)=1 -- 4的二进制右移2位(4>>2,0100右移两位是0001) shiftright(32,3)=4 -- 32的二进制右移3位(32>>3,100000右移3位是0100) SHIFTRIGHTUNSIGNED 命令格式如下: Int shiftrightunsigned(Tinyint|Smallint|Int number1, Int number2) Bigint shiftrightunsigned(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于无符号按位右移(>>>)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bigint类型。 示例如下: shiftrightunsigned(8,2)=2 --8的二进制无符号右移2位(8>>>2,1000右移两位是0010) shiftrightunsigned(-14,2)=1073741820 -- -14的二进制右移2位(-14>>>2, 11111111 11111111 11111111 11110010右移2位是 00111111 11111111 11111111 11111100)

2019-12-01 23:10:57 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 ABS 命令格式如下: Double abs(Double number) Bigint abs(Bigint number) Decimal abs(Decimal number) 命令说明如下: 该函数用于返回number的绝对值。 参数说明: number:当number为Double、Bigint或Decimal类型时。 输入为Bigint,返回Bigint。 输入为Double,返回Double类型。 输入为Decimal,返回Decimal类型。 若输入为String类型,会隐式转换为Double类型后参与运算,其它类型抛异常。 返回值: 返回Double、Bigint或Decimal类型,取决于输入参数的类型。若输入为null,则返回null。 说明 当输入Bigint类型的值超过Bigint的最大表示范围时,会返回Double类型,这种情况下可能会损失精度。 示例如下: abs(null)=null abs(-1)=1 abs(-1.2)=1.2 abs("-2")=2.0 abs(122320837456298376592387456923748)=1.2232083745629837e32 下面是一个完整的ABS函数在SQL中使用的示例,其他内建函数(除窗口函数、聚合函数外)的使用方式与其类似,不再举例。 select abs(id) from tbl1; -- 取tbl1表内id字段的绝对值 ACOS 命令格式如下: Double acos(Double number) Decimal acos(Decimal number) 命令说明如下: 该函数用于计算number的反余弦函数。 参数说明: number:Double类型或Decimal类型,-1 ≤ number ≤1。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型,值域在0 ~ π之间。若number为null,则返回null。 示例如下: acos("0.87")=0.5155940062460905 acos(0)=1.5707963267948966 ASIN 命令格式如下: Double asin(Double number) Decimal asin(Decimal number) 命令说明如下: 该函数用于计算number的反正弦函数。 参数说明: number:Double类型或Decimal类型,-1 ≤ number ≤1。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型,值域在-π/2 ~π/2之间。若number为null,返回null。 示例如下: asin(1)=1.5707963267948966 asin(-1)=-1.5707963267948966 ATAN 命令格式如下: Double atan(Double number) 命令说明如下: 该函数用于计算number的反正切函数。 参数说明: number:Double类型,若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型,值域在-π/2~π/2之间。若number为null,则返回null。 示例如下: atan(1)=0.7853981633974483 atan(-1)=-0.7853981633974483 CEIL 命令格式如下: Bigint ceil(Double value) Bigint ceil(Decimal value) 命令说明如下: 向上取整,函数返回不小于输入值value的最小整数。 参数说明: value:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Bigint类型。任意一个参数输入为null,则返回null。 示例如下: ceil(1.1)=2 ceil(-1.1)=-1 CONV 命令格式如下: String conv(String input, Bigint from_base, Bigint to_base) 命令说明如下: 该函数为进制转换函数。 参数说明: input:以String表示的要转换的整数值,接受Bigint、Double的隐式转换。 from_base、to_base:以十进制表示的进制的值,可接受的的值为2、8、10和16。接受String及Double的隐式转换。 返回值: 返回String类型。任意一个参数输入为null,返回null。转换过程以64位精度工作,溢出时报异常。输入如果是负值,即以(-)开头,报异常。如果输入的是小数,则会转为整数值后进行进制转换,小数部分会被舍弃。 示例如下: conv('1100', 2, 10)='12' conv('1100', 2, 16)='c' conv('ab', 16, 10)='171' conv('ab', 16, 16)='ab' COS 命令格式如下: Double cos(Double number) Decimal cos(Decimal number) 命令说明如下: 该函数用于计算number的余弦函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 示例如下: cos(3.1415926/2)=2.6794896585028633e-8 cos(3.1415926)=-0.9999999999999986 COSH 命令格式如下: Double cosh(Double number) Decimal cosh(Decimal number) 命令说明如下: 该函数用于计算number的双曲余弦函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后,参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,返回null。 COT 命令格式如下: Double cot(Double number) Decimal cot(Decimal number) 命令说明如下: 该函数用于计算number的余切函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 EXP 命令格式如下: Double exp(Double number) Decimal exp(Decimal number) 命令说明如下: 该函数用于计算number的指数函数。 返回值: 返回number的指数值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 FLOOR 命令格式如下: Bigint floor(Double number) Bigint floor(Decimal number) 命令说明如下: 向下取整,函数返回不大于number的最大整数值。 参数说明: number:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Bigint类型。若number为null,则返回null。 示例如下: floor(1.2)=1 floor(1.9)=1 floor(0.1)=0 floor(-1.2)=-2 floor(-0.1)=-1 floor(0.0)=0 floor(-0.0)=0 LN 命令格式如下: Double ln(Double number) Decimal ln(Decimal number) 命令说明如下: 该函数用于返回number的自然对数。 参数说明: number:Double类型或Decimal类型。 若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 若number为null,则返回null。若number为负数或零,则执行报错。 返回值: 返回Double类型或Decimal类型。 LOG 命令格式如下: Double log(Double base, Double x) Decimal log(Decimal base, Decimal x) 命令说明如下: 该函数用于返回以base为底的x的对数。 参数说明: base:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 x:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型的对数值。 若base和x中存在null,则返回null。 若base和x中某一个值为负数或 0,会引发异常。 若base为1(会引发一个除零行为),也会引发异常。 POW 命令格式如下: Double pow(Double x, Double y) Decimal pow(Decimal x, Decimal y) 命令说明如下: 该函数用于返回x的y次方,即x^y。 参数说明: X:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Y:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若x或y为null,则返回null。 RAND 命令格式如下: Double rand(Bigint seed) 命令说明如下: 该函数以seed为种子,返回Double类型的随机数,返回值区间是的0~1。 参数说明: seed:可选参数,Bigint类型,随机数种子,决定随机数序列的起始值。 返回值: 返回Double类型。 示例如下: select rand() from dual; select rand(1) from dual; ROUND 命令格式如下: Double round(Double number, [Bigint Decimal_places]) Decimal round(Decimal number, [Bigint Decimal_places]) 命令说明如下: 该函数四舍五入到指定小数点位置。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Decimal_place:Bigint类型常量,四舍五入计算到小数点后的位置,其他类型参数会引发异常。如果省略表示四舍五入到个位数,默认值为0。 返回值: 返回Double类型或Decimal类型。若number或Decimal_places为null,则返回null。 说明 Decimal_places可以是负数。负数会从小数点向左开始计数,并且不保留小数部分。如果Decimal_places超过了整数部分长度,返回0。 示例如下: round(125.315)=125.0 round(125.315, 0)=125.0 round(125.315, 1)=125.3 round(125.315, 2)=125.32 round(125.315, 3)=125.315 round(-125.315, 2)=-125.32 round(123.345, -2)=100.0 round(null)=null round(123.345, 4)=123.345 round(123.345, -4)=0.0 SIN 命令格式如下所示: Double sin(Double number) Decimal sin(Decimal number) 命令说明如下: 该函数用于计算number的正弦函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 SINH 命令格式如下: Double sinh(Double number) Decimal sinh(Decimal number) 命令说明如下: 该函数用于计算number的双曲正弦函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 SQRT 命令格式如下: Double sqrt(Double number) Decimal sqrt(Decimal number) 命令说明如下: 该函数用于计算number的平方根。 参数说明: number:Double类型或Decimal类型,必须大于0,小于0时引发异常。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TAN 命令说明如下: Double tan(Double number) Decimal tan(Decimal number) 命令说明如下: 该函数用于计算number的正切函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TANH 命令格式如下: Double tanh(Double number) Decimal tanh(Decimal number) 命令说明如下: 该函数用于计算number的双曲正切函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TRUNC 命令格式如下: Double trunc(Double number[, Bigint Decimal_places]) Decimal trunc(Decimal number[, Bigint Decimal_places]) 命令说明如下: 该函数用于将输入值number截取到指定小数点位置。 参数说明: number:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Decimal_places:Bigint类型常量,要截取到的小数点位置,其他类型参数会隐式转为Bigint,省略此参数时默认到截取到个位数。 返回值: 返回值类型为Double或Decimal类型。若number或Decimal_places为null,则返回null。 说明 返回Double类型时,返回的结果的显示可能不符合预期,如示例trunc(125.815, 1)(这个Double类型显示问题任何系统都存在)。 截取掉的部分补0。 Decimal_places可以是负数,负数会从小数点向左开始截取,并且不保留小数部分。如果Decimal_places超过了整数部分长度,则返回0。 示例如下: trunc(125.815)=125.0 trunc(125.815,0)=125.0 trunc(125.815,1)=125.80000000000001 trunc(125.815,2)=125.81 trunc(125.815,3)=125.815 trunc(-125.815,2)=-125.81 trunc(125.815,-1)=120.0 trunc(125.815,-2)=100.0 trunc(125.815,-3)=0.0 trunc(123.345,4)=123.345 trunc(123.345,-4)=0.0 MaxCompute2.0扩展函数 升级到MaxCompute2.0后,产品扩展部分数学函数,新函数若用到新数据类型时,在使用新函数的SQL前,需要加一个set语句: set odps.sql.type.system.odps2=true; 下文将为您详细介绍新扩展的函数。 LOG2 命令格式如下: Double log2(Double number) Double log2(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于以2为底,返回number的对数。 参数说明: number:Double或Decimal类型。 返回值: 返回Double类型。若输入为0或null,则返回null。 示例如下: log2(null)=null log2(0)=null log2(8)=3.0 LOG10 命令格式如下: Double log10(Double number) Double log10(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于以10为底,返回number的对数。 参数说明: number:Double或Decimal类型。 返回值: 返回Double类型。若输入为0或null,则返回null。 示例如下: log10(null)=null log10(0)=null log10(8)=0.9030899869919435 BIN 命令格式如下: String bin(Bigint number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回number的二进制代码表示。 参数说明: number:Bigint类型。 返回值: 返回String类型。若输入为0,返回0,输入为null,则返回null。 示例如下: bin(0)='0' bin(null)='null' bin(12)='1100' HEX 命令格式如下: String hex(Bigint number) String hex(String number) String hex(BINARY number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将整数或字符转换为十六进制格式。 参数说明: number:如果number是Bigint类型,那么返回number的十六进制表示。如果变量是String类型,则返回该字符串的十六进制表示。 返回值: 返回String类型。若输入为0,返回0,输入为null,则返回异常。 示例如下: hex(0)=0 hex('abc')='616263' hex(17)='11' hex('17')='3137' hex(null)异常返回失败 说明 当输入参数为Binary类型时,请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 UNHEX 命令格式如下: BINARY unhex(String number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回十六进制字符串所代表的字符串。 参数说明: number:为十六进制字符串。 返回值: 返回Binary类型,若输入0,返回失败,若输入为null,则返回null。 示例如下: unhex('616263')='abc' unhex(616263)='abc' RADIANS 命令格式如下: Double radians(Double number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将角度转换为弧度。 参数说明: number:Double类型数据。 返回值: 返回Double类型,若输入为null,返回null。 示例如下: radians(90)=1.5707963267948966 radians(0)=0.0 radians(null)=null DEGREES 命令格式如下: Double degrees(Double number) Double degrees(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将弧度转换为角度。 参数说明: number:Double或Decimal类型数据。 返回值: 返回Double类型,若输入null,则返回null。 示例如下: degrees(1.5707963267948966)=90.0 degrees(0)=0.0 degrees(null)=null SIGN 命令格式如下: Double sign(Double number) Double sign(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于取输入数据的符号,1.0表示正,-1.0表示负,否则0.0。 参数说明: number:Double或Decimal类型数据。 返回值: 返回Double类型,若输入0,则返回0.0,输入为null,则返回null。 示例如下: sign(-2.5)=-1.0 sign(2.5)=1.0 sign(0)=0.0 sign(null)=null E 命令格式如下: Double e() 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回e的值。 返回值: 返回Double类型。 示例如下: e()=2.718281828459045 PI 命令格式如下: Double pi() 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回π的值。 返回值: 返回Double类型。 示例如下: pi()=3.141592653589793 FACTORIAL 命令格式如下: Bigint factorial(Int number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回number的阶乘。 参数说明: number:Int类型数据,且在[0..20]之间。 返回值: 返回Bigint类型,输入为0,则返回1,输入为null或[0..20]之外的值,返回null。 示例如下: factorial(5)=120 --5!=5*4*3*2*1=120 CBRT 命令格式如下: Double cbrt(Double number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于计算number的立方根。 参数说明: number:Double类型数据。 返回值: 返回Double类型,输入为null,返回null。 示例如下: cbrt(8)=2 cbrt(null)=null SHIFTLEFT 命令格式如下: Int shiftleft(Tinyint|Smallint|Int number1, Int number2) Bigint shiftleft(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于按位左移(<<)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bingint类型。 示例如下: shiftleft(1,2)=4 --1的二进制左移2位(1<<2,0001左移两位是0100) shiftleft(4,3)=32 --4的二进制左移3位(4<<3,0100左移3位是100000) SHIFTRIGHT 命令格式如下: Int shiftright(Tinyint|Smallint|Int number1, Int number2) Bigint shiftright(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于按位右移(>>)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bigint类型。 示例如下: shiftright(4,2)=1 -- 4的二进制右移2位(4>>2,0100右移两位是0001) shiftright(32,3)=4 -- 32的二进制右移3位(32>>3,100000右移3位是0100) SHIFTRIGHTUNSIGNED 命令格式如下: Int shiftrightunsigned(Tinyint|Smallint|Int number1, Int number2) Bigint shiftrightunsigned(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于无符号按位右移(>>>)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bigint类型。 示例如下: shiftrightunsigned(8,2)=2 --8的二进制无符号右移2位(8>>>2,1000右移两位是0010) shiftrightunsigned(-14,2)=1073741820 -- -14的二进制右移2位(-14>>>2, 11111111 11111111 11111111 11110010右移2位是 00111111 11111111 11111111 11111100)

2019-12-01 23:10:58 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 ABS 命令格式如下: Double abs(Double number) Bigint abs(Bigint number) Decimal abs(Decimal number) 命令说明如下: 该函数用于返回number的绝对值。 参数说明: number:当number为Double、Bigint或Decimal类型时。 输入为Bigint,返回Bigint。 输入为Double,返回Double类型。 输入为Decimal,返回Decimal类型。 若输入为String类型,会隐式转换为Double类型后参与运算,其它类型抛异常。 返回值: 返回Double、Bigint或Decimal类型,取决于输入参数的类型。若输入为null,则返回null。 说明 当输入Bigint类型的值超过Bigint的最大表示范围时,会返回Double类型,这种情况下可能会损失精度。 示例如下: abs(null)=null abs(-1)=1 abs(-1.2)=1.2 abs("-2")=2.0 abs(122320837456298376592387456923748)=1.2232083745629837e32 下面是一个完整的ABS函数在SQL中使用的示例,其他内建函数(除窗口函数、聚合函数外)的使用方式与其类似,不再举例。 select abs(id) from tbl1; -- 取tbl1表内id字段的绝对值 ACOS 命令格式如下: Double acos(Double number) Decimal acos(Decimal number) 命令说明如下: 该函数用于计算number的反余弦函数。 参数说明: number:Double类型或Decimal类型,-1 ≤ number ≤1。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型,值域在0 ~ π之间。若number为null,则返回null。 示例如下: acos("0.87")=0.5155940062460905 acos(0)=1.5707963267948966 ASIN 命令格式如下: Double asin(Double number) Decimal asin(Decimal number) 命令说明如下: 该函数用于计算number的反正弦函数。 参数说明: number:Double类型或Decimal类型,-1 ≤ number ≤1。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型,值域在-π/2 ~π/2之间。若number为null,返回null。 示例如下: asin(1)=1.5707963267948966 asin(-1)=-1.5707963267948966 ATAN 命令格式如下: Double atan(Double number) 命令说明如下: 该函数用于计算number的反正切函数。 参数说明: number:Double类型,若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型,值域在-π/2~π/2之间。若number为null,则返回null。 示例如下: atan(1)=0.7853981633974483 atan(-1)=-0.7853981633974483 CEIL 命令格式如下: Bigint ceil(Double value) Bigint ceil(Decimal value) 命令说明如下: 向上取整,函数返回不小于输入值value的最小整数。 参数说明: value:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Bigint类型。任意一个参数输入为null,则返回null。 示例如下: ceil(1.1)=2 ceil(-1.1)=-1 CONV 命令格式如下: String conv(String input, Bigint from_base, Bigint to_base) 命令说明如下: 该函数为进制转换函数。 参数说明: input:以String表示的要转换的整数值,接受Bigint、Double的隐式转换。 from_base、to_base:以十进制表示的进制的值,可接受的的值为2、8、10和16。接受String及Double的隐式转换。 返回值: 返回String类型。任意一个参数输入为null,返回null。转换过程以64位精度工作,溢出时报异常。输入如果是负值,即以(-)开头,报异常。如果输入的是小数,则会转为整数值后进行进制转换,小数部分会被舍弃。 示例如下: conv('1100', 2, 10)='12' conv('1100', 2, 16)='c' conv('ab', 16, 10)='171' conv('ab', 16, 16)='ab' COS 命令格式如下: Double cos(Double number) Decimal cos(Decimal number) 命令说明如下: 该函数用于计算number的余弦函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 示例如下: cos(3.1415926/2)=2.6794896585028633e-8 cos(3.1415926)=-0.9999999999999986 COSH 命令格式如下: Double cosh(Double number) Decimal cosh(Decimal number) 命令说明如下: 该函数用于计算number的双曲余弦函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后,参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,返回null。 COT 命令格式如下: Double cot(Double number) Decimal cot(Decimal number) 命令说明如下: 该函数用于计算number的余切函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 EXP 命令格式如下: Double exp(Double number) Decimal exp(Decimal number) 命令说明如下: 该函数用于计算number的指数函数。 返回值: 返回number的指数值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 FLOOR 命令格式如下: Bigint floor(Double number) Bigint floor(Decimal number) 命令说明如下: 向下取整,函数返回不大于number的最大整数值。 参数说明: number:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Bigint类型。若number为null,则返回null。 示例如下: floor(1.2)=1 floor(1.9)=1 floor(0.1)=0 floor(-1.2)=-2 floor(-0.1)=-1 floor(0.0)=0 floor(-0.0)=0 LN 命令格式如下: Double ln(Double number) Decimal ln(Decimal number) 命令说明如下: 该函数用于返回number的自然对数。 参数说明: number:Double类型或Decimal类型。 若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 若number为null,则返回null。若number为负数或零,则执行报错。 返回值: 返回Double类型或Decimal类型。 LOG 命令格式如下: Double log(Double base, Double x) Decimal log(Decimal base, Decimal x) 命令说明如下: 该函数用于返回以base为底的x的对数。 参数说明: base:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 x:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型的对数值。 若base和x中存在null,则返回null。 若base和x中某一个值为负数或 0,会引发异常。 若base为1(会引发一个除零行为),也会引发异常。 POW 命令格式如下: Double pow(Double x, Double y) Decimal pow(Decimal x, Decimal y) 命令说明如下: 该函数用于返回x的y次方,即x^y。 参数说明: X:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Y:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若x或y为null,则返回null。 RAND 命令格式如下: Double rand(Bigint seed) 命令说明如下: 该函数以seed为种子,返回Double类型的随机数,返回值区间是的0~1。 参数说明: seed:可选参数,Bigint类型,随机数种子,决定随机数序列的起始值。 返回值: 返回Double类型。 示例如下: select rand() from dual; select rand(1) from dual; ROUND 命令格式如下: Double round(Double number, [Bigint Decimal_places]) Decimal round(Decimal number, [Bigint Decimal_places]) 命令说明如下: 该函数四舍五入到指定小数点位置。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Decimal_place:Bigint类型常量,四舍五入计算到小数点后的位置,其他类型参数会引发异常。如果省略表示四舍五入到个位数,默认值为0。 返回值: 返回Double类型或Decimal类型。若number或Decimal_places为null,则返回null。 说明 Decimal_places可以是负数。负数会从小数点向左开始计数,并且不保留小数部分。如果Decimal_places超过了整数部分长度,返回0。 示例如下: round(125.315)=125.0 round(125.315, 0)=125.0 round(125.315, 1)=125.3 round(125.315, 2)=125.32 round(125.315, 3)=125.315 round(-125.315, 2)=-125.32 round(123.345, -2)=100.0 round(null)=null round(123.345, 4)=123.345 round(123.345, -4)=0.0 SIN 命令格式如下所示: Double sin(Double number) Decimal sin(Decimal number) 命令说明如下: 该函数用于计算number的正弦函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 SINH 命令格式如下: Double sinh(Double number) Decimal sinh(Decimal number) 命令说明如下: 该函数用于计算number的双曲正弦函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 SQRT 命令格式如下: Double sqrt(Double number) Decimal sqrt(Decimal number) 命令说明如下: 该函数用于计算number的平方根。 参数说明: number:Double类型或Decimal类型,必须大于0,小于0时引发异常。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TAN 命令说明如下: Double tan(Double number) Decimal tan(Decimal number) 命令说明如下: 该函数用于计算number的正切函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TANH 命令格式如下: Double tanh(Double number) Decimal tanh(Decimal number) 命令说明如下: 该函数用于计算number的双曲正切函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TRUNC 命令格式如下: Double trunc(Double number[, Bigint Decimal_places]) Decimal trunc(Decimal number[, Bigint Decimal_places]) 命令说明如下: 该函数用于将输入值number截取到指定小数点位置。 参数说明: number:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Decimal_places:Bigint类型常量,要截取到的小数点位置,其他类型参数会隐式转为Bigint,省略此参数时默认到截取到个位数。 返回值: 返回值类型为Double或Decimal类型。若number或Decimal_places为null,则返回null。 说明 返回Double类型时,返回的结果的显示可能不符合预期,如示例trunc(125.815, 1)(这个Double类型显示问题任何系统都存在)。 截取掉的部分补0。 Decimal_places可以是负数,负数会从小数点向左开始截取,并且不保留小数部分。如果Decimal_places超过了整数部分长度,则返回0。 示例如下: trunc(125.815)=125.0 trunc(125.815,0)=125.0 trunc(125.815,1)=125.80000000000001 trunc(125.815,2)=125.81 trunc(125.815,3)=125.815 trunc(-125.815,2)=-125.81 trunc(125.815,-1)=120.0 trunc(125.815,-2)=100.0 trunc(125.815,-3)=0.0 trunc(123.345,4)=123.345 trunc(123.345,-4)=0.0 MaxCompute2.0扩展函数 升级到MaxCompute2.0后,产品扩展部分数学函数,新函数若用到新数据类型时,在使用新函数的SQL前,需要加一个set语句: set odps.sql.type.system.odps2=true; 下文将为您详细介绍新扩展的函数。 LOG2 命令格式如下: Double log2(Double number) Double log2(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于以2为底,返回number的对数。 参数说明: number:Double或Decimal类型。 返回值: 返回Double类型。若输入为0或null,则返回null。 示例如下: log2(null)=null log2(0)=null log2(8)=3.0 LOG10 命令格式如下: Double log10(Double number) Double log10(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于以10为底,返回number的对数。 参数说明: number:Double或Decimal类型。 返回值: 返回Double类型。若输入为0或null,则返回null。 示例如下: log10(null)=null log10(0)=null log10(8)=0.9030899869919435 BIN 命令格式如下: String bin(Bigint number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回number的二进制代码表示。 参数说明: number:Bigint类型。 返回值: 返回String类型。若输入为0,返回0,输入为null,则返回null。 示例如下: bin(0)='0' bin(null)='null' bin(12)='1100' HEX 命令格式如下: String hex(Bigint number) String hex(String number) String hex(BINARY number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将整数或字符转换为十六进制格式。 参数说明: number:如果number是Bigint类型,那么返回number的十六进制表示。如果变量是String类型,则返回该字符串的十六进制表示。 返回值: 返回String类型。若输入为0,返回0,输入为null,则返回异常。 示例如下: hex(0)=0 hex('abc')='616263' hex(17)='11' hex('17')='3137' hex(null)异常返回失败 说明 当输入参数为Binary类型时,请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 UNHEX 命令格式如下: BINARY unhex(String number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回十六进制字符串所代表的字符串。 参数说明: number:为十六进制字符串。 返回值: 返回Binary类型,若输入0,返回失败,若输入为null,则返回null。 示例如下: unhex('616263')='abc' unhex(616263)='abc' RADIANS 命令格式如下: Double radians(Double number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将角度转换为弧度。 参数说明: number:Double类型数据。 返回值: 返回Double类型,若输入为null,返回null。 示例如下: radians(90)=1.5707963267948966 radians(0)=0.0 radians(null)=null DEGREES 命令格式如下: Double degrees(Double number) Double degrees(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将弧度转换为角度。 参数说明: number:Double或Decimal类型数据。 返回值: 返回Double类型,若输入null,则返回null。 示例如下: degrees(1.5707963267948966)=90.0 degrees(0)=0.0 degrees(null)=null SIGN 命令格式如下: Double sign(Double number) Double sign(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于取输入数据的符号,1.0表示正,-1.0表示负,否则0.0。 参数说明: number:Double或Decimal类型数据。 返回值: 返回Double类型,若输入0,则返回0.0,输入为null,则返回null。 示例如下: sign(-2.5)=-1.0 sign(2.5)=1.0 sign(0)=0.0 sign(null)=null E 命令格式如下: Double e() 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回e的值。 返回值: 返回Double类型。 示例如下: e()=2.718281828459045 PI 命令格式如下: Double pi() 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回π的值。 返回值: 返回Double类型。 示例如下: pi()=3.141592653589793 FACTORIAL 命令格式如下: Bigint factorial(Int number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回number的阶乘。 参数说明: number:Int类型数据,且在[0..20]之间。 返回值: 返回Bigint类型,输入为0,则返回1,输入为null或[0..20]之外的值,返回null。 示例如下: factorial(5)=120 --5!=5*4*3*2*1=120 CBRT 命令格式如下: Double cbrt(Double number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于计算number的立方根。 参数说明: number:Double类型数据。 返回值: 返回Double类型,输入为null,返回null。 示例如下: cbrt(8)=2 cbrt(null)=null SHIFTLEFT 命令格式如下: Int shiftleft(Tinyint|Smallint|Int number1, Int number2) Bigint shiftleft(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于按位左移(<<)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bingint类型。 示例如下: shiftleft(1,2)=4 --1的二进制左移2位(1<<2,0001左移两位是0100) shiftleft(4,3)=32 --4的二进制左移3位(4<<3,0100左移3位是100000) SHIFTRIGHT 命令格式如下: Int shiftright(Tinyint|Smallint|Int number1, Int number2) Bigint shiftright(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于按位右移(>>)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bigint类型。 示例如下: shiftright(4,2)=1 -- 4的二进制右移2位(4>>2,0100右移两位是0001) shiftright(32,3)=4 -- 32的二进制右移3位(32>>3,100000右移3位是0100) SHIFTRIGHTUNSIGNED 命令格式如下: Int shiftrightunsigned(Tinyint|Smallint|Int number1, Int number2) Bigint shiftrightunsigned(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于无符号按位右移(>>>)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bigint类型。 示例如下: shiftrightunsigned(8,2)=2 --8的二进制无符号右移2位(8>>>2,1000右移两位是0010) shiftrightunsigned(-14,2)=1073741820 -- -14的二进制右移2位(-14>>>2, 11111111 11111111 11111111 11110010右移2位是 00111111 11111111 11111111 11111100)

2019-12-01 23:10:59 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 ABS 命令格式如下: Double abs(Double number) Bigint abs(Bigint number) Decimal abs(Decimal number) 命令说明如下: 该函数用于返回number的绝对值。 参数说明: number:当number为Double、Bigint或Decimal类型时。 输入为Bigint,返回Bigint。 输入为Double,返回Double类型。 输入为Decimal,返回Decimal类型。 若输入为String类型,会隐式转换为Double类型后参与运算,其它类型抛异常。 返回值: 返回Double、Bigint或Decimal类型,取决于输入参数的类型。若输入为null,则返回null。 说明 当输入Bigint类型的值超过Bigint的最大表示范围时,会返回Double类型,这种情况下可能会损失精度。 示例如下: abs(null)=null abs(-1)=1 abs(-1.2)=1.2 abs("-2")=2.0 abs(122320837456298376592387456923748)=1.2232083745629837e32 下面是一个完整的ABS函数在SQL中使用的示例,其他内建函数(除窗口函数、聚合函数外)的使用方式与其类似,不再举例。 select abs(id) from tbl1; -- 取tbl1表内id字段的绝对值 ACOS 命令格式如下: Double acos(Double number) Decimal acos(Decimal number) 命令说明如下: 该函数用于计算number的反余弦函数。 参数说明: number:Double类型或Decimal类型,-1 ≤ number ≤1。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型,值域在0 ~ π之间。若number为null,则返回null。 示例如下: acos("0.87")=0.5155940062460905 acos(0)=1.5707963267948966 ASIN 命令格式如下: Double asin(Double number) Decimal asin(Decimal number) 命令说明如下: 该函数用于计算number的反正弦函数。 参数说明: number:Double类型或Decimal类型,-1 ≤ number ≤1。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型,值域在-π/2 ~π/2之间。若number为null,返回null。 示例如下: asin(1)=1.5707963267948966 asin(-1)=-1.5707963267948966 ATAN 命令格式如下: Double atan(Double number) 命令说明如下: 该函数用于计算number的反正切函数。 参数说明: number:Double类型,若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型,值域在-π/2~π/2之间。若number为null,则返回null。 示例如下: atan(1)=0.7853981633974483 atan(-1)=-0.7853981633974483 CEIL 命令格式如下: Bigint ceil(Double value) Bigint ceil(Decimal value) 命令说明如下: 向上取整,函数返回不小于输入值value的最小整数。 参数说明: value:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Bigint类型。任意一个参数输入为null,则返回null。 示例如下: ceil(1.1)=2 ceil(-1.1)=-1 CONV 命令格式如下: String conv(String input, Bigint from_base, Bigint to_base) 命令说明如下: 该函数为进制转换函数。 参数说明: input:以String表示的要转换的整数值,接受Bigint、Double的隐式转换。 from_base、to_base:以十进制表示的进制的值,可接受的的值为2、8、10和16。接受String及Double的隐式转换。 返回值: 返回String类型。任意一个参数输入为null,返回null。转换过程以64位精度工作,溢出时报异常。输入如果是负值,即以(-)开头,报异常。如果输入的是小数,则会转为整数值后进行进制转换,小数部分会被舍弃。 示例如下: conv('1100', 2, 10)='12' conv('1100', 2, 16)='c' conv('ab', 16, 10)='171' conv('ab', 16, 16)='ab' COS 命令格式如下: Double cos(Double number) Decimal cos(Decimal number) 命令说明如下: 该函数用于计算number的余弦函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 示例如下: cos(3.1415926/2)=2.6794896585028633e-8 cos(3.1415926)=-0.9999999999999986 COSH 命令格式如下: Double cosh(Double number) Decimal cosh(Decimal number) 命令说明如下: 该函数用于计算number的双曲余弦函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后,参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,返回null。 COT 命令格式如下: Double cot(Double number) Decimal cot(Decimal number) 命令说明如下: 该函数用于计算number的余切函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 EXP 命令格式如下: Double exp(Double number) Decimal exp(Decimal number) 命令说明如下: 该函数用于计算number的指数函数。 返回值: 返回number的指数值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 FLOOR 命令格式如下: Bigint floor(Double number) Bigint floor(Decimal number) 命令说明如下: 向下取整,函数返回不大于number的最大整数值。 参数说明: number:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Bigint类型。若number为null,则返回null。 示例如下: floor(1.2)=1 floor(1.9)=1 floor(0.1)=0 floor(-1.2)=-2 floor(-0.1)=-1 floor(0.0)=0 floor(-0.0)=0 LN 命令格式如下: Double ln(Double number) Decimal ln(Decimal number) 命令说明如下: 该函数用于返回number的自然对数。 参数说明: number:Double类型或Decimal类型。 若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 若number为null,则返回null。若number为负数或零,则执行报错。 返回值: 返回Double类型或Decimal类型。 LOG 命令格式如下: Double log(Double base, Double x) Decimal log(Decimal base, Decimal x) 命令说明如下: 该函数用于返回以base为底的x的对数。 参数说明: base:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 x:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型的对数值。 若base和x中存在null,则返回null。 若base和x中某一个值为负数或 0,会引发异常。 若base为1(会引发一个除零行为),也会引发异常。 POW 命令格式如下: Double pow(Double x, Double y) Decimal pow(Decimal x, Decimal y) 命令说明如下: 该函数用于返回x的y次方,即x^y。 参数说明: X:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Y:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若x或y为null,则返回null。 RAND 命令格式如下: Double rand(Bigint seed) 命令说明如下: 该函数以seed为种子,返回Double类型的随机数,返回值区间是的0~1。 参数说明: seed:可选参数,Bigint类型,随机数种子,决定随机数序列的起始值。 返回值: 返回Double类型。 示例如下: select rand() from dual; select rand(1) from dual; ROUND 命令格式如下: Double round(Double number, [Bigint Decimal_places]) Decimal round(Decimal number, [Bigint Decimal_places]) 命令说明如下: 该函数四舍五入到指定小数点位置。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Decimal_place:Bigint类型常量,四舍五入计算到小数点后的位置,其他类型参数会引发异常。如果省略表示四舍五入到个位数,默认值为0。 返回值: 返回Double类型或Decimal类型。若number或Decimal_places为null,则返回null。 说明 Decimal_places可以是负数。负数会从小数点向左开始计数,并且不保留小数部分。如果Decimal_places超过了整数部分长度,返回0。 示例如下: round(125.315)=125.0 round(125.315, 0)=125.0 round(125.315, 1)=125.3 round(125.315, 2)=125.32 round(125.315, 3)=125.315 round(-125.315, 2)=-125.32 round(123.345, -2)=100.0 round(null)=null round(123.345, 4)=123.345 round(123.345, -4)=0.0 SIN 命令格式如下所示: Double sin(Double number) Decimal sin(Decimal number) 命令说明如下: 该函数用于计算number的正弦函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 SINH 命令格式如下: Double sinh(Double number) Decimal sinh(Decimal number) 命令说明如下: 该函数用于计算number的双曲正弦函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 SQRT 命令格式如下: Double sqrt(Double number) Decimal sqrt(Decimal number) 命令说明如下: 该函数用于计算number的平方根。 参数说明: number:Double类型或Decimal类型,必须大于0,小于0时引发异常。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TAN 命令说明如下: Double tan(Double number) Decimal tan(Decimal number) 命令说明如下: 该函数用于计算number的正切函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TANH 命令格式如下: Double tanh(Double number) Decimal tanh(Decimal number) 命令说明如下: 该函数用于计算number的双曲正切函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TRUNC 命令格式如下: Double trunc(Double number[, Bigint Decimal_places]) Decimal trunc(Decimal number[, Bigint Decimal_places]) 命令说明如下: 该函数用于将输入值number截取到指定小数点位置。 参数说明: number:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Decimal_places:Bigint类型常量,要截取到的小数点位置,其他类型参数会隐式转为Bigint,省略此参数时默认到截取到个位数。 返回值: 返回值类型为Double或Decimal类型。若number或Decimal_places为null,则返回null。 说明 返回Double类型时,返回的结果的显示可能不符合预期,如示例trunc(125.815, 1)(这个Double类型显示问题任何系统都存在)。 截取掉的部分补0。 Decimal_places可以是负数,负数会从小数点向左开始截取,并且不保留小数部分。如果Decimal_places超过了整数部分长度,则返回0。 示例如下: trunc(125.815)=125.0 trunc(125.815,0)=125.0 trunc(125.815,1)=125.80000000000001 trunc(125.815,2)=125.81 trunc(125.815,3)=125.815 trunc(-125.815,2)=-125.81 trunc(125.815,-1)=120.0 trunc(125.815,-2)=100.0 trunc(125.815,-3)=0.0 trunc(123.345,4)=123.345 trunc(123.345,-4)=0.0 MaxCompute2.0扩展函数 升级到MaxCompute2.0后,产品扩展部分数学函数,新函数若用到新数据类型时,在使用新函数的SQL前,需要加一个set语句: set odps.sql.type.system.odps2=true; 下文将为您详细介绍新扩展的函数。 LOG2 命令格式如下: Double log2(Double number) Double log2(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于以2为底,返回number的对数。 参数说明: number:Double或Decimal类型。 返回值: 返回Double类型。若输入为0或null,则返回null。 示例如下: log2(null)=null log2(0)=null log2(8)=3.0 LOG10 命令格式如下: Double log10(Double number) Double log10(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于以10为底,返回number的对数。 参数说明: number:Double或Decimal类型。 返回值: 返回Double类型。若输入为0或null,则返回null。 示例如下: log10(null)=null log10(0)=null log10(8)=0.9030899869919435 BIN 命令格式如下: String bin(Bigint number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回number的二进制代码表示。 参数说明: number:Bigint类型。 返回值: 返回String类型。若输入为0,返回0,输入为null,则返回null。 示例如下: bin(0)='0' bin(null)='null' bin(12)='1100' HEX 命令格式如下: String hex(Bigint number) String hex(String number) String hex(BINARY number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将整数或字符转换为十六进制格式。 参数说明: number:如果number是Bigint类型,那么返回number的十六进制表示。如果变量是String类型,则返回该字符串的十六进制表示。 返回值: 返回String类型。若输入为0,返回0,输入为null,则返回异常。 示例如下: hex(0)=0 hex('abc')='616263' hex(17)='11' hex('17')='3137' hex(null)异常返回失败 说明 当输入参数为Binary类型时,请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 UNHEX 命令格式如下: BINARY unhex(String number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回十六进制字符串所代表的字符串。 参数说明: number:为十六进制字符串。 返回值: 返回Binary类型,若输入0,返回失败,若输入为null,则返回null。 示例如下: unhex('616263')='abc' unhex(616263)='abc' RADIANS 命令格式如下: Double radians(Double number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将角度转换为弧度。 参数说明: number:Double类型数据。 返回值: 返回Double类型,若输入为null,返回null。 示例如下: radians(90)=1.5707963267948966 radians(0)=0.0 radians(null)=null DEGREES 命令格式如下: Double degrees(Double number) Double degrees(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将弧度转换为角度。 参数说明: number:Double或Decimal类型数据。 返回值: 返回Double类型,若输入null,则返回null。 示例如下: degrees(1.5707963267948966)=90.0 degrees(0)=0.0 degrees(null)=null SIGN 命令格式如下: Double sign(Double number) Double sign(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于取输入数据的符号,1.0表示正,-1.0表示负,否则0.0。 参数说明: number:Double或Decimal类型数据。 返回值: 返回Double类型,若输入0,则返回0.0,输入为null,则返回null。 示例如下: sign(-2.5)=-1.0 sign(2.5)=1.0 sign(0)=0.0 sign(null)=null E 命令格式如下: Double e() 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回e的值。 返回值: 返回Double类型。 示例如下: e()=2.718281828459045 PI 命令格式如下: Double pi() 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回π的值。 返回值: 返回Double类型。 示例如下: pi()=3.141592653589793 FACTORIAL 命令格式如下: Bigint factorial(Int number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回number的阶乘。 参数说明: number:Int类型数据,且在[0..20]之间。 返回值: 返回Bigint类型,输入为0,则返回1,输入为null或[0..20]之外的值,返回null。 示例如下: factorial(5)=120 --5!=5*4*3*2*1=120 CBRT 命令格式如下: Double cbrt(Double number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于计算number的立方根。 参数说明: number:Double类型数据。 返回值: 返回Double类型,输入为null,返回null。 示例如下: cbrt(8)=2 cbrt(null)=null SHIFTLEFT 命令格式如下: Int shiftleft(Tinyint|Smallint|Int number1, Int number2) Bigint shiftleft(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于按位左移(<<)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bingint类型。 示例如下: shiftleft(1,2)=4 --1的二进制左移2位(1<<2,0001左移两位是0100) shiftleft(4,3)=32 --4的二进制左移3位(4<<3,0100左移3位是100000) SHIFTRIGHT 命令格式如下: Int shiftright(Tinyint|Smallint|Int number1, Int number2) Bigint shiftright(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于按位右移(>>)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bigint类型。 示例如下: shiftright(4,2)=1 -- 4的二进制右移2位(4>>2,0100右移两位是0001) shiftright(32,3)=4 -- 32的二进制右移3位(32>>3,100000右移3位是0100) SHIFTRIGHTUNSIGNED 命令格式如下: Int shiftrightunsigned(Tinyint|Smallint|Int number1, Int number2) Bigint shiftrightunsigned(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于无符号按位右移(>>>)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bigint类型。 示例如下: shiftrightunsigned(8,2)=2 --8的二进制无符号右移2位(8>>>2,1000右移两位是0010) shiftrightunsigned(-14,2)=1073741820 -- -14的二进制右移2位(-14>>>2, 11111111 11111111 11111111 11110010右移2位是 00111111 11111111 11111111 11111100)

2019-12-01 23:10:59 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 ABS 命令格式如下: Double abs(Double number) Bigint abs(Bigint number) Decimal abs(Decimal number) 命令说明如下: 该函数用于返回number的绝对值。 参数说明: number:当number为Double、Bigint或Decimal类型时。 输入为Bigint,返回Bigint。 输入为Double,返回Double类型。 输入为Decimal,返回Decimal类型。 若输入为String类型,会隐式转换为Double类型后参与运算,其它类型抛异常。 返回值: 返回Double、Bigint或Decimal类型,取决于输入参数的类型。若输入为null,则返回null。 说明 当输入Bigint类型的值超过Bigint的最大表示范围时,会返回Double类型,这种情况下可能会损失精度。 示例如下: abs(null)=null abs(-1)=1 abs(-1.2)=1.2 abs("-2")=2.0 abs(122320837456298376592387456923748)=1.2232083745629837e32 下面是一个完整的ABS函数在SQL中使用的示例,其他内建函数(除窗口函数、聚合函数外)的使用方式与其类似,不再举例。 select abs(id) from tbl1; -- 取tbl1表内id字段的绝对值 ACOS 命令格式如下: Double acos(Double number) Decimal acos(Decimal number) 命令说明如下: 该函数用于计算number的反余弦函数。 参数说明: number:Double类型或Decimal类型,-1 ≤ number ≤1。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型,值域在0 ~ π之间。若number为null,则返回null。 示例如下: acos("0.87")=0.5155940062460905 acos(0)=1.5707963267948966 ASIN 命令格式如下: Double asin(Double number) Decimal asin(Decimal number) 命令说明如下: 该函数用于计算number的反正弦函数。 参数说明: number:Double类型或Decimal类型,-1 ≤ number ≤1。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型,值域在-π/2 ~π/2之间。若number为null,返回null。 示例如下: asin(1)=1.5707963267948966 asin(-1)=-1.5707963267948966 ATAN 命令格式如下: Double atan(Double number) 命令说明如下: 该函数用于计算number的反正切函数。 参数说明: number:Double类型,若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型,值域在-π/2~π/2之间。若number为null,则返回null。 示例如下: atan(1)=0.7853981633974483 atan(-1)=-0.7853981633974483 CEIL 命令格式如下: Bigint ceil(Double value) Bigint ceil(Decimal value) 命令说明如下: 向上取整,函数返回不小于输入值value的最小整数。 参数说明: value:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Bigint类型。任意一个参数输入为null,则返回null。 示例如下: ceil(1.1)=2 ceil(-1.1)=-1 CONV 命令格式如下: String conv(String input, Bigint from_base, Bigint to_base) 命令说明如下: 该函数为进制转换函数。 参数说明: input:以String表示的要转换的整数值,接受Bigint、Double的隐式转换。 from_base、to_base:以十进制表示的进制的值,可接受的的值为2、8、10和16。接受String及Double的隐式转换。 返回值: 返回String类型。任意一个参数输入为null,返回null。转换过程以64位精度工作,溢出时报异常。输入如果是负值,即以(-)开头,报异常。如果输入的是小数,则会转为整数值后进行进制转换,小数部分会被舍弃。 示例如下: conv('1100', 2, 10)='12' conv('1100', 2, 16)='c' conv('ab', 16, 10)='171' conv('ab', 16, 16)='ab' COS 命令格式如下: Double cos(Double number) Decimal cos(Decimal number) 命令说明如下: 该函数用于计算number的余弦函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 示例如下: cos(3.1415926/2)=2.6794896585028633e-8 cos(3.1415926)=-0.9999999999999986 COSH 命令格式如下: Double cosh(Double number) Decimal cosh(Decimal number) 命令说明如下: 该函数用于计算number的双曲余弦函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后,参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,返回null。 COT 命令格式如下: Double cot(Double number) Decimal cot(Decimal number) 命令说明如下: 该函数用于计算number的余切函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 EXP 命令格式如下: Double exp(Double number) Decimal exp(Decimal number) 命令说明如下: 该函数用于计算number的指数函数。 返回值: 返回number的指数值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 FLOOR 命令格式如下: Bigint floor(Double number) Bigint floor(Decimal number) 命令说明如下: 向下取整,函数返回不大于number的最大整数值。 参数说明: number:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Bigint类型。若number为null,则返回null。 示例如下: floor(1.2)=1 floor(1.9)=1 floor(0.1)=0 floor(-1.2)=-2 floor(-0.1)=-1 floor(0.0)=0 floor(-0.0)=0 LN 命令格式如下: Double ln(Double number) Decimal ln(Decimal number) 命令说明如下: 该函数用于返回number的自然对数。 参数说明: number:Double类型或Decimal类型。 若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 若number为null,则返回null。若number为负数或零,则执行报错。 返回值: 返回Double类型或Decimal类型。 LOG 命令格式如下: Double log(Double base, Double x) Decimal log(Decimal base, Decimal x) 命令说明如下: 该函数用于返回以base为底的x的对数。 参数说明: base:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 x:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型的对数值。 若base和x中存在null,则返回null。 若base和x中某一个值为负数或 0,会引发异常。 若base为1(会引发一个除零行为),也会引发异常。 POW 命令格式如下: Double pow(Double x, Double y) Decimal pow(Decimal x, Decimal y) 命令说明如下: 该函数用于返回x的y次方,即x^y。 参数说明: X:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Y:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若x或y为null,则返回null。 RAND 命令格式如下: Double rand(Bigint seed) 命令说明如下: 该函数以seed为种子,返回Double类型的随机数,返回值区间是的0~1。 参数说明: seed:可选参数,Bigint类型,随机数种子,决定随机数序列的起始值。 返回值: 返回Double类型。 示例如下: select rand() from dual; select rand(1) from dual; ROUND 命令格式如下: Double round(Double number, [Bigint Decimal_places]) Decimal round(Decimal number, [Bigint Decimal_places]) 命令说明如下: 该函数四舍五入到指定小数点位置。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Decimal_place:Bigint类型常量,四舍五入计算到小数点后的位置,其他类型参数会引发异常。如果省略表示四舍五入到个位数,默认值为0。 返回值: 返回Double类型或Decimal类型。若number或Decimal_places为null,则返回null。 说明 Decimal_places可以是负数。负数会从小数点向左开始计数,并且不保留小数部分。如果Decimal_places超过了整数部分长度,返回0。 示例如下: round(125.315)=125.0 round(125.315, 0)=125.0 round(125.315, 1)=125.3 round(125.315, 2)=125.32 round(125.315, 3)=125.315 round(-125.315, 2)=-125.32 round(123.345, -2)=100.0 round(null)=null round(123.345, 4)=123.345 round(123.345, -4)=0.0 SIN 命令格式如下所示: Double sin(Double number) Decimal sin(Decimal number) 命令说明如下: 该函数用于计算number的正弦函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 SINH 命令格式如下: Double sinh(Double number) Decimal sinh(Decimal number) 命令说明如下: 该函数用于计算number的双曲正弦函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 SQRT 命令格式如下: Double sqrt(Double number) Decimal sqrt(Decimal number) 命令说明如下: 该函数用于计算number的平方根。 参数说明: number:Double类型或Decimal类型,必须大于0,小于0时引发异常。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TAN 命令说明如下: Double tan(Double number) Decimal tan(Decimal number) 命令说明如下: 该函数用于计算number的正切函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TANH 命令格式如下: Double tanh(Double number) Decimal tanh(Decimal number) 命令说明如下: 该函数用于计算number的双曲正切函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TRUNC 命令格式如下: Double trunc(Double number[, Bigint Decimal_places]) Decimal trunc(Decimal number[, Bigint Decimal_places]) 命令说明如下: 该函数用于将输入值number截取到指定小数点位置。 参数说明: number:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Decimal_places:Bigint类型常量,要截取到的小数点位置,其他类型参数会隐式转为Bigint,省略此参数时默认到截取到个位数。 返回值: 返回值类型为Double或Decimal类型。若number或Decimal_places为null,则返回null。 说明 返回Double类型时,返回的结果的显示可能不符合预期,如示例trunc(125.815, 1)(这个Double类型显示问题任何系统都存在)。 截取掉的部分补0。 Decimal_places可以是负数,负数会从小数点向左开始截取,并且不保留小数部分。如果Decimal_places超过了整数部分长度,则返回0。 示例如下: trunc(125.815)=125.0 trunc(125.815,0)=125.0 trunc(125.815,1)=125.80000000000001 trunc(125.815,2)=125.81 trunc(125.815,3)=125.815 trunc(-125.815,2)=-125.81 trunc(125.815,-1)=120.0 trunc(125.815,-2)=100.0 trunc(125.815,-3)=0.0 trunc(123.345,4)=123.345 trunc(123.345,-4)=0.0 MaxCompute2.0扩展函数 升级到MaxCompute2.0后,产品扩展部分数学函数,新函数若用到新数据类型时,在使用新函数的SQL前,需要加一个set语句: set odps.sql.type.system.odps2=true; 下文将为您详细介绍新扩展的函数。 LOG2 命令格式如下: Double log2(Double number) Double log2(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于以2为底,返回number的对数。 参数说明: number:Double或Decimal类型。 返回值: 返回Double类型。若输入为0或null,则返回null。 示例如下: log2(null)=null log2(0)=null log2(8)=3.0 LOG10 命令格式如下: Double log10(Double number) Double log10(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于以10为底,返回number的对数。 参数说明: number:Double或Decimal类型。 返回值: 返回Double类型。若输入为0或null,则返回null。 示例如下: log10(null)=null log10(0)=null log10(8)=0.9030899869919435 BIN 命令格式如下: String bin(Bigint number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回number的二进制代码表示。 参数说明: number:Bigint类型。 返回值: 返回String类型。若输入为0,返回0,输入为null,则返回null。 示例如下: bin(0)='0' bin(null)='null' bin(12)='1100' HEX 命令格式如下: String hex(Bigint number) String hex(String number) String hex(BINARY number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将整数或字符转换为十六进制格式。 参数说明: number:如果number是Bigint类型,那么返回number的十六进制表示。如果变量是String类型,则返回该字符串的十六进制表示。 返回值: 返回String类型。若输入为0,返回0,输入为null,则返回异常。 示例如下: hex(0)=0 hex('abc')='616263' hex(17)='11' hex('17')='3137' hex(null)异常返回失败 说明 当输入参数为Binary类型时,请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 UNHEX 命令格式如下: BINARY unhex(String number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回十六进制字符串所代表的字符串。 参数说明: number:为十六进制字符串。 返回值: 返回Binary类型,若输入0,返回失败,若输入为null,则返回null。 示例如下: unhex('616263')='abc' unhex(616263)='abc' RADIANS 命令格式如下: Double radians(Double number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将角度转换为弧度。 参数说明: number:Double类型数据。 返回值: 返回Double类型,若输入为null,返回null。 示例如下: radians(90)=1.5707963267948966 radians(0)=0.0 radians(null)=null DEGREES 命令格式如下: Double degrees(Double number) Double degrees(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将弧度转换为角度。 参数说明: number:Double或Decimal类型数据。 返回值: 返回Double类型,若输入null,则返回null。 示例如下: degrees(1.5707963267948966)=90.0 degrees(0)=0.0 degrees(null)=null SIGN 命令格式如下: Double sign(Double number) Double sign(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于取输入数据的符号,1.0表示正,-1.0表示负,否则0.0。 参数说明: number:Double或Decimal类型数据。 返回值: 返回Double类型,若输入0,则返回0.0,输入为null,则返回null。 示例如下: sign(-2.5)=-1.0 sign(2.5)=1.0 sign(0)=0.0 sign(null)=null E 命令格式如下: Double e() 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回e的值。 返回值: 返回Double类型。 示例如下: e()=2.718281828459045 PI 命令格式如下: Double pi() 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回π的值。 返回值: 返回Double类型。 示例如下: pi()=3.141592653589793 FACTORIAL 命令格式如下: Bigint factorial(Int number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回number的阶乘。 参数说明: number:Int类型数据,且在[0..20]之间。 返回值: 返回Bigint类型,输入为0,则返回1,输入为null或[0..20]之外的值,返回null。 示例如下: factorial(5)=120 --5!=5*4*3*2*1=120 CBRT 命令格式如下: Double cbrt(Double number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于计算number的立方根。 参数说明: number:Double类型数据。 返回值: 返回Double类型,输入为null,返回null。 示例如下: cbrt(8)=2 cbrt(null)=null SHIFTLEFT 命令格式如下: Int shiftleft(Tinyint|Smallint|Int number1, Int number2) Bigint shiftleft(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于按位左移(<<)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bingint类型。 示例如下: shiftleft(1,2)=4 --1的二进制左移2位(1<<2,0001左移两位是0100) shiftleft(4,3)=32 --4的二进制左移3位(4<<3,0100左移3位是100000) SHIFTRIGHT 命令格式如下: Int shiftright(Tinyint|Smallint|Int number1, Int number2) Bigint shiftright(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于按位右移(>>)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bigint类型。 示例如下: shiftright(4,2)=1 -- 4的二进制右移2位(4>>2,0100右移两位是0001) shiftright(32,3)=4 -- 32的二进制右移3位(32>>3,100000右移3位是0100) SHIFTRIGHTUNSIGNED 命令格式如下: Int shiftrightunsigned(Tinyint|Smallint|Int number1, Int number2) Bigint shiftrightunsigned(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于无符号按位右移(>>>)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bigint类型。 示例如下: shiftrightunsigned(8,2)=2 --8的二进制无符号右移2位(8>>>2,1000右移两位是0010) shiftrightunsigned(-14,2)=1073741820 -- -14的二进制右移2位(-14>>>2, 11111111 11111111 11111111 11110010右移2位是 00111111 11111111 11111111 11111100)

2019-12-01 23:10:58 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 ABS 命令格式如下: Double abs(Double number) Bigint abs(Bigint number) Decimal abs(Decimal number) 命令说明如下: 该函数用于返回number的绝对值。 参数说明: number:当number为Double、Bigint或Decimal类型时。 输入为Bigint,返回Bigint。 输入为Double,返回Double类型。 输入为Decimal,返回Decimal类型。 若输入为String类型,会隐式转换为Double类型后参与运算,其它类型抛异常。 返回值: 返回Double、Bigint或Decimal类型,取决于输入参数的类型。若输入为null,则返回null。 说明 当输入Bigint类型的值超过Bigint的最大表示范围时,会返回Double类型,这种情况下可能会损失精度。 示例如下: abs(null)=null abs(-1)=1 abs(-1.2)=1.2 abs("-2")=2.0 abs(122320837456298376592387456923748)=1.2232083745629837e32 下面是一个完整的ABS函数在SQL中使用的示例,其他内建函数(除窗口函数、聚合函数外)的使用方式与其类似,不再举例。 select abs(id) from tbl1; -- 取tbl1表内id字段的绝对值 ACOS 命令格式如下: Double acos(Double number) Decimal acos(Decimal number) 命令说明如下: 该函数用于计算number的反余弦函数。 参数说明: number:Double类型或Decimal类型,-1 ≤ number ≤1。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型,值域在0 ~ π之间。若number为null,则返回null。 示例如下: acos("0.87")=0.5155940062460905 acos(0)=1.5707963267948966 ASIN 命令格式如下: Double asin(Double number) Decimal asin(Decimal number) 命令说明如下: 该函数用于计算number的反正弦函数。 参数说明: number:Double类型或Decimal类型,-1 ≤ number ≤1。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型,值域在-π/2 ~π/2之间。若number为null,返回null。 示例如下: asin(1)=1.5707963267948966 asin(-1)=-1.5707963267948966 ATAN 命令格式如下: Double atan(Double number) 命令说明如下: 该函数用于计算number的反正切函数。 参数说明: number:Double类型,若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型,值域在-π/2~π/2之间。若number为null,则返回null。 示例如下: atan(1)=0.7853981633974483 atan(-1)=-0.7853981633974483 CEIL 命令格式如下: Bigint ceil(Double value) Bigint ceil(Decimal value) 命令说明如下: 向上取整,函数返回不小于输入值value的最小整数。 参数说明: value:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Bigint类型。任意一个参数输入为null,则返回null。 示例如下: ceil(1.1)=2 ceil(-1.1)=-1 CONV 命令格式如下: String conv(String input, Bigint from_base, Bigint to_base) 命令说明如下: 该函数为进制转换函数。 参数说明: input:以String表示的要转换的整数值,接受Bigint、Double的隐式转换。 from_base、to_base:以十进制表示的进制的值,可接受的的值为2、8、10和16。接受String及Double的隐式转换。 返回值: 返回String类型。任意一个参数输入为null,返回null。转换过程以64位精度工作,溢出时报异常。输入如果是负值,即以(-)开头,报异常。如果输入的是小数,则会转为整数值后进行进制转换,小数部分会被舍弃。 示例如下: conv('1100', 2, 10)='12' conv('1100', 2, 16)='c' conv('ab', 16, 10)='171' conv('ab', 16, 16)='ab' COS 命令格式如下: Double cos(Double number) Decimal cos(Decimal number) 命令说明如下: 该函数用于计算number的余弦函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换到Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 示例如下: cos(3.1415926/2)=2.6794896585028633e-8 cos(3.1415926)=-0.9999999999999986 COSH 命令格式如下: Double cosh(Double number) Decimal cosh(Decimal number) 命令说明如下: 该函数用于计算number的双曲余弦函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后,参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,返回null。 COT 命令格式如下: Double cot(Double number) Decimal cot(Decimal number) 命令说明如下: 该函数用于计算number的余切函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 EXP 命令格式如下: Double exp(Double number) Decimal exp(Decimal number) 命令说明如下: 该函数用于计算number的指数函数。 返回值: 返回number的指数值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 FLOOR 命令格式如下: Bigint floor(Double number) Bigint floor(Decimal number) 命令说明如下: 向下取整,函数返回不大于number的最大整数值。 参数说明: number:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Bigint类型。若number为null,则返回null。 示例如下: floor(1.2)=1 floor(1.9)=1 floor(0.1)=0 floor(-1.2)=-2 floor(-0.1)=-1 floor(0.0)=0 floor(-0.0)=0 LN 命令格式如下: Double ln(Double number) Decimal ln(Decimal number) 命令说明如下: 该函数用于返回number的自然对数。 参数说明: number:Double类型或Decimal类型。 若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 若number为null,则返回null。若number为负数或零,则执行报错。 返回值: 返回Double类型或Decimal类型。 LOG 命令格式如下: Double log(Double base, Double x) Decimal log(Decimal base, Decimal x) 命令说明如下: 该函数用于返回以base为底的x的对数。 参数说明: base:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 x:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型的对数值。 若base和x中存在null,则返回null。 若base和x中某一个值为负数或 0,会引发异常。 若base为1(会引发一个除零行为),也会引发异常。 POW 命令格式如下: Double pow(Double x, Double y) Decimal pow(Decimal x, Decimal y) 命令说明如下: 该函数用于返回x的y次方,即x^y。 参数说明: X:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Y:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若x或y为null,则返回null。 RAND 命令格式如下: Double rand(Bigint seed) 命令说明如下: 该函数以seed为种子,返回Double类型的随机数,返回值区间是的0~1。 参数说明: seed:可选参数,Bigint类型,随机数种子,决定随机数序列的起始值。 返回值: 返回Double类型。 示例如下: select rand() from dual; select rand(1) from dual; ROUND 命令格式如下: Double round(Double number, [Bigint Decimal_places]) Decimal round(Decimal number, [Bigint Decimal_places]) 命令说明如下: 该函数四舍五入到指定小数点位置。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Decimal_place:Bigint类型常量,四舍五入计算到小数点后的位置,其他类型参数会引发异常。如果省略表示四舍五入到个位数,默认值为0。 返回值: 返回Double类型或Decimal类型。若number或Decimal_places为null,则返回null。 说明 Decimal_places可以是负数。负数会从小数点向左开始计数,并且不保留小数部分。如果Decimal_places超过了整数部分长度,返回0。 示例如下: round(125.315)=125.0 round(125.315, 0)=125.0 round(125.315, 1)=125.3 round(125.315, 2)=125.32 round(125.315, 3)=125.315 round(-125.315, 2)=-125.32 round(123.345, -2)=100.0 round(null)=null round(123.345, 4)=123.345 round(123.345, -4)=0.0 SIN 命令格式如下所示: Double sin(Double number) Decimal sin(Decimal number) 命令说明如下: 该函数用于计算number的正弦函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 SINH 命令格式如下: Double sinh(Double number) Decimal sinh(Decimal number) 命令说明如下: 该函数用于计算number的双曲正弦函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 SQRT 命令格式如下: Double sqrt(Double number) Decimal sqrt(Decimal number) 命令说明如下: 该函数用于计算number的平方根。 参数说明: number:Double类型或Decimal类型,必须大于0,小于0时引发异常。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TAN 命令说明如下: Double tan(Double number) Decimal tan(Decimal number) 命令说明如下: 该函数用于计算number的正切函数,输入为弧度值。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TANH 命令格式如下: Double tanh(Double number) Decimal tanh(Decimal number) 命令说明如下: 该函数用于计算number的双曲正切函数。 参数说明: number:Double类型或Decimal类型。若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 返回值: 返回Double类型或Decimal类型。若number为null,则返回null。 TRUNC 命令格式如下: Double trunc(Double number[, Bigint Decimal_places]) Decimal trunc(Decimal number[, Bigint Decimal_places]) 命令说明如下: 该函数用于将输入值number截取到指定小数点位置。 参数说明: number:Double类型或Decimal类型,若输入为String类型或Bigint类型,会隐式转换为Double类型后参与运算,其他类型抛异常。 Decimal_places:Bigint类型常量,要截取到的小数点位置,其他类型参数会隐式转为Bigint,省略此参数时默认到截取到个位数。 返回值: 返回值类型为Double或Decimal类型。若number或Decimal_places为null,则返回null。 说明 返回Double类型时,返回的结果的显示可能不符合预期,如示例trunc(125.815, 1)(这个Double类型显示问题任何系统都存在)。 截取掉的部分补0。 Decimal_places可以是负数,负数会从小数点向左开始截取,并且不保留小数部分。如果Decimal_places超过了整数部分长度,则返回0。 示例如下: trunc(125.815)=125.0 trunc(125.815,0)=125.0 trunc(125.815,1)=125.80000000000001 trunc(125.815,2)=125.81 trunc(125.815,3)=125.815 trunc(-125.815,2)=-125.81 trunc(125.815,-1)=120.0 trunc(125.815,-2)=100.0 trunc(125.815,-3)=0.0 trunc(123.345,4)=123.345 trunc(123.345,-4)=0.0 MaxCompute2.0扩展函数 升级到MaxCompute2.0后,产品扩展部分数学函数,新函数若用到新数据类型时,在使用新函数的SQL前,需要加一个set语句: set odps.sql.type.system.odps2=true; 下文将为您详细介绍新扩展的函数。 LOG2 命令格式如下: Double log2(Double number) Double log2(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于以2为底,返回number的对数。 参数说明: number:Double或Decimal类型。 返回值: 返回Double类型。若输入为0或null,则返回null。 示例如下: log2(null)=null log2(0)=null log2(8)=3.0 LOG10 命令格式如下: Double log10(Double number) Double log10(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于以10为底,返回number的对数。 参数说明: number:Double或Decimal类型。 返回值: 返回Double类型。若输入为0或null,则返回null。 示例如下: log10(null)=null log10(0)=null log10(8)=0.9030899869919435 BIN 命令格式如下: String bin(Bigint number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回number的二进制代码表示。 参数说明: number:Bigint类型。 返回值: 返回String类型。若输入为0,返回0,输入为null,则返回null。 示例如下: bin(0)='0' bin(null)='null' bin(12)='1100' HEX 命令格式如下: String hex(Bigint number) String hex(String number) String hex(BINARY number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将整数或字符转换为十六进制格式。 参数说明: number:如果number是Bigint类型,那么返回number的十六进制表示。如果变量是String类型,则返回该字符串的十六进制表示。 返回值: 返回String类型。若输入为0,返回0,输入为null,则返回异常。 示例如下: hex(0)=0 hex('abc')='616263' hex(17)='11' hex('17')='3137' hex(null)异常返回失败 说明 当输入参数为Binary类型时,请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 UNHEX 命令格式如下: BINARY unhex(String number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回十六进制字符串所代表的字符串。 参数说明: number:为十六进制字符串。 返回值: 返回Binary类型,若输入0,返回失败,若输入为null,则返回null。 示例如下: unhex('616263')='abc' unhex(616263)='abc' RADIANS 命令格式如下: Double radians(Double number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将角度转换为弧度。 参数说明: number:Double类型数据。 返回值: 返回Double类型,若输入为null,返回null。 示例如下: radians(90)=1.5707963267948966 radians(0)=0.0 radians(null)=null DEGREES 命令格式如下: Double degrees(Double number) Double degrees(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于将弧度转换为角度。 参数说明: number:Double或Decimal类型数据。 返回值: 返回Double类型,若输入null,则返回null。 示例如下: degrees(1.5707963267948966)=90.0 degrees(0)=0.0 degrees(null)=null SIGN 命令格式如下: Double sign(Double number) Double sign(Decimal number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于取输入数据的符号,1.0表示正,-1.0表示负,否则0.0。 参数说明: number:Double或Decimal类型数据。 返回值: 返回Double类型,若输入0,则返回0.0,输入为null,则返回null。 示例如下: sign(-2.5)=-1.0 sign(2.5)=1.0 sign(0)=0.0 sign(null)=null E 命令格式如下: Double e() 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回e的值。 返回值: 返回Double类型。 示例如下: e()=2.718281828459045 PI 命令格式如下: Double pi() 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回π的值。 返回值: 返回Double类型。 示例如下: pi()=3.141592653589793 FACTORIAL 命令格式如下: Bigint factorial(Int number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于返回number的阶乘。 参数说明: number:Int类型数据,且在[0..20]之间。 返回值: 返回Bigint类型,输入为0,则返回1,输入为null或[0..20]之外的值,返回null。 示例如下: factorial(5)=120 --5!=5*4*3*2*1=120 CBRT 命令格式如下: Double cbrt(Double number) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于计算number的立方根。 参数说明: number:Double类型数据。 返回值: 返回Double类型,输入为null,返回null。 示例如下: cbrt(8)=2 cbrt(null)=null SHIFTLEFT 命令格式如下: Int shiftleft(Tinyint|Smallint|Int number1, Int number2) Bigint shiftleft(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于按位左移(<<)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bingint类型。 示例如下: shiftleft(1,2)=4 --1的二进制左移2位(1<<2,0001左移两位是0100) shiftleft(4,3)=32 --4的二进制左移3位(4<<3,0100左移3位是100000) SHIFTRIGHT 命令格式如下: Int shiftright(Tinyint|Smallint|Int number1, Int number2) Bigint shiftright(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于按位右移(>>)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bigint类型。 示例如下: shiftright(4,2)=1 -- 4的二进制右移2位(4>>2,0100右移两位是0001) shiftright(32,3)=4 -- 32的二进制右移3位(32>>3,100000右移3位是0100) SHIFTRIGHTUNSIGNED 命令格式如下: Int shiftrightunsigned(Tinyint|Smallint|Int number1, Int number2) Bigint shiftrightunsigned(Bigint number1, Int number2) 说明 请在用到该函数的SQL语句前加set odps.sql.type.system.odps2=true;,并与SQL一起提交运行,以便正常使用新数据类型。 命令说明如下: 该函数用于无符号按位右移(>>>)。 参数说明: number1:Tinyint|Smallint|Int|Bigint整型数据。 number2:Int整型数据。 返回值: 返回Int或Bigint类型。 示例如下: shiftrightunsigned(8,2)=2 --8的二进制无符号右移2位(8>>>2,1000右移两位是0010) shiftrightunsigned(-14,2)=1073741820 -- -14的二进制右移2位(-14>>>2, 11111111 11111111 11111111 11110010右移2位是 00111111 11111111 11111111 11111100)

2019-12-01 23:10:58 0 浏览量 回答数 0

回答

两个操作数都小于 int,将会被同时隐式转换为int进行运算,等价于(short) ((int)(short) 0xFF00 + (int)(byte) 0xF0))short、byte、int都是有符号的(int)(short) 0xFF00的值是 0xFFFFFF00(int)(byte) 0xF0的值是 0xFFFFFFF0相加的结果就是0xFFFFFEFO,溢出了一位,再强制转换为short,直接截取出0xFEFO

蛮大人123 2019-12-02 01:54:22 0 浏览量 回答数 0

回答

18世纪德国数理哲学大师莱布尼兹从他的传教士朋友鲍威特寄给他的拉丁文译本《易经》中,读到了八卦的组成结构,惊奇地发现其基本素数(0)(1),即《易经》的阴爻- -和__阳爻,其进位制就是二进制,并认为这是世界上数学进制中最先进的。 20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,其运算模式正是二进制。它不但证明了莱布尼兹的原理是正确的,同时也证明了《易经》数理学是很了不起的。 [编辑本段]进制数 1、二进制数据的表示法 二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。二进制数据也是采用位置计数法,其位权是以2为底的幂。例如二进制数据110.11,其权的大小顺序为2^2、2^1、2^0、2^-1、2^-2。对于有n位整数,m位小数的二进制数据用加权系数展开式表示,可写为: (a(n-1)a(n-2)…a(-m))2=a(n-1)×2^(n-1)+a(n-2)×2^(n-2)+……+a(1)×2^1+a(0)×2^0+a(-1)×2^(-1)+a(-2)×2^(-2)+……+a(-m)×2^(-m) 二进制数据一般可写为:(a(n-1)a(n-2)…a(1)a(0).a(-1)a(-2)…a(-m))2。 注意: 1.式中aj表示第j位的系数,它为0和1中的某一个数。 2.a(n-1)中的(n-1)为下标,输入法无法打出所以用括号括住,避免混淆。 3.2^2表示2的平方,以此类推。 【例1102】将二进制数据111.01写成加权系数的形式。 解:(111.01)2=(1×2^2)+(1×2^1)+(1×2^0)+(0×2^-1)+(1×2^-2) [编辑本段]二进制运算 二进制数据的算术运算的基本规律和十进制数的运算十分相似。最常用的是加法运算和乘法运算。 1. 二进制加法 有四种情况: 0+0=0 0+1=1 1+0=1 1+1=10 进位为1 【例1103】求 (1101)2+(1011)2 的和 解: ??1 1 0 1 + ?1 0 1 1 ------------------- ?1 1 0 0 0 2. 二进制乘法 有四种情况: 0×0=0 1×0=0 0×1=0 1×1=1 【例1104】求 (1110)2 乘(101)2 之积 解: ???1 1 1 0 × ?? 1 0 1 ----------------------- ??? 1 1 1 0 ?? 0 0 0 0 ?1 1 1 0 ------------------------- 1 0 0 0 1 1 0 (这些计算就跟十进制的加或者乘法相同,只是进位的数不一样而已,十进制的是到十才进位这里是到2就进了) [编辑本段]莱布尼茨的二进制 在德国图灵根著名的郭塔王宫图书馆(Schlossbiliothke zu Gotha)保存着一份弥足珍贵的手稿,其标题为: “1与0,一切数字的神奇渊源。这是造物的秘密美妙的典范,因为,一切无非都来自上帝。” 这是德国天才大师莱布尼茨(Gottfried Wilhelm Leibniz,1646 - 1716)的手迹。但是,关于这个神奇美妙的数字系统,莱布尼茨只有几页异常精炼的描述。用现代人熟悉的话,我们可以对二进制作如下的解释: 2^0 = 1 2^1 = 2 2^2 = 4 2^3 = 8 2^4 = 16 2^5 = 32 2^6 = 64 2^7 = 128 以此类推。 把等号右边的数字相加,就可以获得任意一个自然数。我们只需要说明:采用了2的几次方,而舍掉了2几次方。二进制的表述序列都从右边开始,第一位是2的0次方,第二位是2的1次方,第三位时2的2次方……,以此类推。一切采用2的成方的位置,我们就用“1”来标志,一切舍掉2的成方的位置,我们就用“0”来标志。这样,我们就得到了下边这个序列: 1 1 1 0 0 1 0 1 2的7次方 2的6次方 2的5次方 0 0 2的2次方 0 2的0次方 128 + 64 + 32 + 0 + 0 + 4 + 0 + 1 = 229 在这个例子中,十进制的数字“229”就可以表述为二进制的“11100101”。任何一个二进制数字最左边的一位都是“1”。通过这个方法,用1到9和0这十个数字表述的整个自然数列都可用0和1两个数字来代替。0与1这两个数字很容易被电子化:有电流就是1;没有电流就是0。这就整个现代计算机技术的根本秘密所在。

boxti 2019-12-02 01:28:08 0 浏览量 回答数 0

回答

十进制,二进制,八进制,十六进制及之间的转换 进制概念 1。 十进制 十进制使用十个数字(0、1、2、3、4、5、6、7、8、9)记数,基数为10,逢十进一。 历史上第一台电子数字计算机ENIAC是一台十进制机器,其数字以十进制表示,并以十进制形式运算。设计十进制机器比设计二进制机器复杂得多。而自然界具有两种稳定状态的组件普遍存在,如开关的开和关,电路的通和断,电压的高和低等,非常适合表示计算机中的数。设计过程简单,可靠性高。因此,现在改为二进制计算机。 2。 二进制 二进制以2为基数,只用0和1两个数字表示数,逢2进一。 二进制与遵循十进制数遵循一样的运算规则,但显得比十进制更简单。例如: (1)加法:0+0=0 0+1=1 1+0=1 1+1=0 (2)减法:0-0=0 1-1=0 1-0=1 0-1=1 (3)乘法:0*0=0 0*1=0 1*0=0 1*1=1 (4)除法:0/1=0 1/1=1,除数不能为0 3。 八进制 所谓八进制,就是其基数为8,基数值可以取0、1、2、3、4、5、6、7共8个值,逢八进一。 八进制与十进制运算规则一样。那么为什么要用八进制呢。难道要设计八进制的计算机么。实际上,八进制与十六进制的引用,主要是为了书写和表示方便,因为二进制表示位数比较长。如:(1024)10 用二进制表示为 (10000000000)2,共有11个数字,用八进制表示为(2000)8。更重要的是,由于二进制与八进制存在在一种对等关系,每三位二进制与一位八进制数完全对等(23=8)。所以二进制和十进制在运算上无区别,而时进制不具备这一优点。 4。 十六进制 十六进制应用也是非常广泛的一种计数制。在使用者看来,十六进制是二进制数的一种更加紧凑的一种表示方法。 基数为:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,逢十进一。在十六进制系统中,数值为10到15的数分别用A、B、C、D、E、F表示。 二进制数及与之等值的八进制、十进制和十六进制数 二进制 八进制 十进制 十六进制 0000 0 0 0 0001 1 1 1 0010 2 2 2 0011 3 3 3 0100 4 4 4 0101 5 5 5 01106 6 6 0111 7 7 7 1000 10 8 8 1001 11 9 9 1010 12 10 A 1011 13 11 B 1100 14 12 C 1101 15 13 D 1110 16 14 E 1111 17 15 二。进制转换 1。二进制与十进制数间的转换 (1)二进制转换为十进制 将每个二进制数按权展开后求和即可。请看例题: 把二进制数(101.101)2=1*22+0*21+1*20+1*2-1+0*2-2+1*2-3=(5.625)10 (2)十进制转换为二进制 一般需要将十进制数的整数部分与小数部分分开处理。 整数部分计算方法:除2取余法 请看例题: 十进制数(53)10的二进制值为(110101)2 小数部分计算方法:乘2取整法,即每一步将十进制小数部分乘以2,所得积的小数点左边的数字(0或1)作为二进制表示法中的数字,第一次乘法所得的整数部分为最高位。请看例题: 将(0.5125)10转换成二进制。(0.5125)10=(0.101)2 2。 八进制、十六进制与十六进制间的转换 八进制、十六进制与十六进制之间的转换方法与二进制,同十进制之间的转换方法类似。例如: (73)8=7*81+3=(59)10 (0.56)8=5*8-1+6*8-2=(0.71875)10 (12A)16=1*162+2*161+A*160=(298)10 (0.3C8)16=3*16-1+12*16-2+8*16-3=(0.142578125)10 十进制整数→→→→→八进制 方法:“除8取余” 十进制整数→→→→→十六进制 方法:“除16取余” 例如: (171)10=(253)8 (2653)10=(A5D)16 十进制小数→→→→→八进制小数 方法:“乘8取整” 十进制小数→→→→→十六进制小数 方法:“乘16取整” 例如: (0。71875)10=(0.56)8 (0.142578125)10=(0.3C8)16 3. 非十进制数之间的转换 (1)二进制数与八进制数之间的转换 转换方法是:以小数点为界,分别向左右每三位二进制数合成一位八进制数,或每一位八进制数展成三位二进制数,不足三位者补0。例如: (423。45)8=(100 010 011.100 101)2 (1001001.1101)2=(001 001 001.110 100)2=(111.64)8 2。二进制与十六进制转换 转换方法:以小数点为界,分别向左右每四位二进制合成一位十六进制数,或每一位十六进制数展成四位二进制数,不足四位者补0。例如: (ABCD。EF)16=(1010 1011 1100 1101.1110 1111)2 (101101101001011.01101)2=(0101 1011 0100 1011.0110 1000)2=(5B4B。68)16

马铭芳 2019-12-02 01:28:37 0 浏览量 回答数 0

回答

是的,您可以使用内置的hashlib模块或内置的hash函数。然后,对整数形式的哈希使用模运算或字符串切片运算来切掉最后八位数字: s = 'she sells sea shells by the sea shore' Use hashlib import hashlib int(hashlib.sha1(s).hexdigest(), 16) % (10 ** 8) 58097614L Use hash() abs(hash(s)) % (10 ** 8) 82148974

保持可爱mmm 2020-02-08 19:24:31 0 浏览量 回答数 0

回答

关于二十四点游戏的编程思路与基本算法 漫长的假期对于我来说总是枯燥无味的,闲来无聊便和同学玩起童年时经常玩的二十四点牌游戏来。此游戏说来简单,就是利用加减乘除以及括号将给出的四张牌组成一个值为24的表达式。但是其中却不乏一些有趣的题目,这不,我们刚玩了一会儿,便遇到了一个难题——3、6、6、10(其实后来想想,这也不算是个太难的题,只是当时我们的脑筋都没有转弯而已,呵呵)。 问题既然出现了,我们当然要解决。冥思苦想之际,我的脑中掠过一丝念头——何不编个程序来解决这个问题呢。文曲星中不就有这样的程序吗。所以这个想法应该是可行。想到这里我立刻开始思索这个程序的算法,最先想到的自然是穷举法(后来发现我再也想不到更好的方法了,悲哀呀,呵呵),因为在这学期我曾经写过一个小程序——计算有括号的简单表达式。只要我能编程实现四个数加上运算符号所构成的表达式的穷举,不就可以利用这个计算程序来完成这个计算二十四点的程序吗。确定了这个思路之后,我开始想这个问题的细节。 首先穷举的可行性问题。我把表达式如下分成三类—— 1、 无括号的简单表达式。 2、 有一个括号的简单表达式。 3、 有两个括号的较复4、 杂表达式。 穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。我利用一个嵌套函数实现四个数的排列,算法如下: /* ans[] 用来存放各种排列组合的数组 */ /* c[] 存放四张牌的数组 */ /* k[] c[]种四张牌的代号,其中k[I]=I+1。 用它来代替c[]做处理,考虑到c[]中有可能出现相同数的情况 */ /* kans[] 暂存生成的排列组合 */ /* j 嵌套循环的次数 */ int fans(c,k,ans,kans,j) int j,k[],c[];char ans[],kans[]; { int i,p,q,r,h,flag,s[4],t[4][4]; for(p=0,q=0;p<4;p++) { for(r=0,flag=0;r if(k[p]!=kans[r]) flag++; if(flag==j) t[j][q++]=k[p]; } for(s[j]=0;s[j]<4-j;s[j]++) { kans[j]=t[j][s[j>; if(j==3) { for(h=0;h<4;h++) ans[2*h]=c[kans[h]-1]; /* 调整生成的排列组合在最终的表 达式中的位置 */ for(h=0;h<3;h++) symbol(ans,h); /* 在表达式中添加运算符号 */ } else { j++; fans(c,k,ans,kans,j); j--; } } } 正如上面函数中提到的,在完成四张牌的排列之后,在表达式中添加运算符号。由于只有四张牌,所以只要添加三个运算符号就可以了。由于每一个运算符号可重复,所以计算出其可能的种数为4*4*4=64种。仍然利用嵌套函数实现添加运算符号的穷举,算法如下: /* ans[],j同上。sy[]存放四个运算符号。h为表达式形式。*/ int sans(ans,sy,j,h) char ans[],sy[];int j,h; { int i,p,k[3],m,n; char ktans[20]; for(k[j]=0;k[j]<4;k[j]++) { ans[2*j+1]=sy[k[j>; /* 刚才的四个数分别存放在0、2、4、6位 这里的三个运算符号分别存放在1、3、5位*/ if(j==2) { ans[5]=sy[k[j>; /* 此处根据不同的表达式形式再进行相应的处理 */ } else } } 好了,接下来我再考虑不同表达式的处理。刚才我已经将表达式分为三类,是因为添加三个括号对于四张牌来说肯定是重复的。对于第一种,无括号自然不用另行处理;而第二种情况由以下代码可以得出其可能性有六种,其中还有一种是多余的。 for(m=0;m<=4;m+=2) for(n=m+4;n<=8;n+=2) 这个for循环给出了添加一个括号的可能性的种数,其中m、n分别为添加在表达式中的左右括号的位置。我所说的多余的是指m=0,n=8,也就是放在表达式的两端。这真是多此一举,呵呵。最后一种情况是添加两个括号,我分析了一下,发现只可能是这种形式才不会是重复的——(a b)(c d)。为什么不会出现嵌套括号的情况呢。因为如果是嵌套括号,那么外面的括号肯定是包含三个数字的(四个没有必要),也就是说这个括号里面包含了两个运算符号,而这两个运算符号是被另外一个括号隔开的。那么如果这两个运算符号是同一优先级的,则肯定可以通过一些转换去掉括号(你不妨举一些例子来试试),也就是说这一个括号没有必要;如果这两个运算符号不是同一优先级,也必然是这种形式((a+-b)*/c)。而*和/在这几个运算符号中优先级最高,自然就没有必要在它的外面添加括号了。 综上所述,所有可能的表达式的种数为24*64*(1+6+1)=12288种。哈哈,只有一万多种可能性(这其中还有重复),这对于电脑来说可是小case哟。所以,对于穷举的可行性分析和实现也就完成了。 接下来的问题就是如何对有符号的简单表达式进行处理。这是栈的一个著名应用,那么什么是栈呢。栈的概念是从日常生活中货物在货栈种的存取过程抽象出来的,即最后存放入栈的货物(堆在靠出口处)先被提取出去,符合“先进后出,后进先出”的原则。这种结构犹如子弹夹。 在栈中,元素的插入称为压入(push)或入栈,元素的删除称为弹出(pop)或退栈。 栈的基本运算有三种,其中包括入栈运算、退栈运算以及读栈顶元素,这些请参考相关数据结构资料。根据这些基本运算就可以用数组模拟出栈来。 那么作为栈的著名应用,表达式的计算可以有两种方法。 第一种方法—— 首先建立两个栈,操作数栈OVS和运算符栈OPS。其中,操作数栈用来记忆表达式中的操作数,其栈顶指针为topv,初始时为空,即topv=0;运算符栈用来记忆表达式中的运算符,其栈顶指针为topp,初始时,栈中只有一个表达式结束符,即topp=1,且OPS(1)=‘;’。此处的‘;’即表达式结束符。 然后自左至右的扫描待处理的表达式,并假设当前扫描到的符号为W,根据不同的符号W做如下不同的处理: 1、 若W为操作数 2、 则将W压入操作数栈OVS 3、 且继续扫描下一个字符 4、 若W为运算符 5、 则根据运算符的性质做相应的处理: (1)、若运算符为左括号或者运算符的优先级大于运算符栈栈顶的运算符(即OPS(top)),则将运算符W压入运算符栈OPS,并继续扫描下一个字符。 (2)、若运算符W为表达式结束符‘;’且运算符栈栈顶的运算符也为表达式结束符(即OPS(topp)=’;’),则处理过程结束,此时,操作数栈栈顶元素(即OVS(topv))即为表达式的值。 (3)、若运算符W为右括号且运算符栈栈顶的运算符为左括号(即OPS(topp)=’(‘),则将左括号从运算符栈谈出,且继续扫描下一个符号。 (4)、若运算符的右不大于运算符栈栈顶的运算符(即OPS(topp)),则从操作数栈OVS中弹出两个操作数,设先后弹出的操作数为a、b,再从运算符栈OPS中弹出一个运算符,设为+,然后作运算a+b,并将运算结果压入操作数栈OVS。本次的运算符下次将重新考虑。 第二种方法—— 首先对表达式进行线性化,然后将线性表达式转换成机器指令序列以便进行求值。 那么什么是表达式的线性化呢。人们所习惯的表达式的表达方法称为中缀表示。中缀表示的特点是运算符位于运算对象的中间。但这种表示方式,有时必须借助括号才能将运算顺序表达清楚,而且处理也比较复杂。 1929年,波兰逻辑学家Lukasiewicz提出一种不用括号的逻辑符号体系,后来人们称之为波兰表示法(Polish notation)。波兰表达式的特点是运算符位于运算对象的后面,因此称为后缀表示。在对波兰表达式进行运算,严格按照自左至右的顺序进行。下面给出一些表达式及其相应的波兰表达式。 表达式 波兰表达式 A-B AB- (A-B)*C+D AB-C*D+ A*(B+C/D)-E*F ABCD/+*EF*- (B+C)/(A-D) BC+AD-/ OK,所谓表达式的线性化是指将中缀表达的表达式转化为波兰表达式。对于每一个表达式,利用栈可以把表达式变换成波兰表达式,也可以利用栈来计算波兰表达式的值。 至于转换和计算的过程和第一种方法大同小异,这里就不再赘述了。 下面给出转换和计算的具体实现程序—— /* first函数给出各个运算符的优先级,其中=为表达式结束符 */ int first(char c) { int p; switch(c) { case '*': p=2; break; case '/': p=2; break; case '+': p=1; break; case '-': p=1; break; case '(': p=0; break; case '=': p=-1; break; } return(p); } /* 此函数实现中缀到后缀的转换 */ /* M的值宏定义为20 */ /* sp[]为表达式数组 */ int mid_last() { int i=0,j=0; char c,sm[M]; c=s[0]; sm[0]='='; top=0; while(c!='\0') { if(islower(c)) sp[j++]=c; else switch(c) { case '+': case '-': case '*': case '/': while(first(c)<=first(sm[top])) sp[j++]=sm[top--]; sm[++top]=c; break; case '(': sm[++top]=c; break; case ')': while(sm[top]!='(') sp[j++]=sm[top--]; top--; break; default :return(1); } c=s[++i]; } while(top>0) sp[j++]=sm[top--]; sp[j]='\0'; return(0); } /* 由后缀表达式来计算表达式的值 */ int calc() { int i=0,sm[M],tr; char c; c=sp[0]; top=-1; while(c!='\0') { if(islower(c)) sm[++top]=ver[c-'a'];/*在转换过程中用abcd等来代替数, 这样才可以更方便的处理非一位数, ver数组中存放着这些字母所代替的数*/ else switch(c) { case '+': tr=sm[top--]; sm[top]+=tr; break; case '-': tr=sm[top--]; sm[top]-=tr; break; case '*': tr=sm[top--]; sm[top]*=tr; break; case '/': tr=sm[top--];sm[top]/=tr;break; default : return(1); } c=sp[++i]; } if(top>0) return(1); else } 这样这个程序基本上就算解决了,回过头来拿这个程序来算一算文章开始的那个问题。哈哈,算出来了,原来如此简单——(6-3)*10-6=24。 最后我总结了一下这其中容易出错的地方—— 1、 排列的时候由于一个数只能出现一次, 所以必然有一个判断语句。但是用什么来判断,用大小显然不行,因为有可能这四个数中有两个或者以上的数是相同的。我的方法是给每一个数设置一个代号,在排列结束时,通过这个代号找到这个数。 2、在应用嵌套函数时,需仔细分析程序的执行过程,并对个别变量进行适当的调整(如j的值),程序才能正确的执行。 3、在分析括号问题的时候要认真仔细,不要错过任何一个可能的机会,也要尽量使程序变得简单一些。不过我的分析可能也有问题,还请高手指点。 4、在用函数对一个数组进行处理的时候,一定要注意如果这个数组还需要再应用,就必须将它先保存起来,否则会出错,而且是很严重的错误。 5、在处理用户输入的表达式时,由于一个十位数或者更高位数是被分解成各位数存放在数组中,所以需对它们进行处理,将它们转化成实际的整型变量。另外,在转化过程中,用一个字母来代替这个数,并将这个数存在一个数组中,且它在数组中的位置和代替它的这个字母有一定的联系,这样才能取回这个数。 6、由于在穷举过程难免会出现计算过程中有除以0的计算,所以我们必须对calc函数种对于除的运算加以处理,否则程序会因为出错而退出(Divide by 0)。 7、最后一个问题,本程序尚未解决。对于一些比较著名的题目,本程序无法解答。比如说5、5、5、1或者8、8、3、3。这是由于这些题目在计算的过程用到了小数,而本程序并没有考虑到小数。

知与谁同 2019-12-02 01:22:19 0 浏览量 回答数 0

回答

#include <iostream> #include <string> using namespace std; inline int compare(string str1,string str2) {//相等返回0,大于返回1,小于返回-1 if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数 else if (str1.size()<str2.size()) return -1; else return str1.compare(str2); //若长度相等,则头到尾按位比较 } string SUB_INT(string str1,string str2); string ADD_INT(string str1,string str2) {//高精度加法 int sign=1; //sign 为符号位 string str; if (str1[0]=='-') { if (str2[0]=='-') { sign=-1; str=ADD_INT(str1.erase(0,1),str2.erase(0,1)); } else { str=SUB_INT(str2,str1.erase(0,1)); } } else { if (str2[0]=='-') { str=SUB_INT(str1,str2.erase(0,1)); } else { //把两个整数对齐,短整数前面加0补齐 string::size_type L1,L2; int i; L1=str1.size(); L2=str2.size(); if (L1<L2) { for (i=1;i<=L2-L1;i++) str1="0"+str1; } else { for (i=1;i<=L1-L2;i++) str2="0"+str2; } int int1=0,int2=0; //int2 记录进位 for (i=str1.size()-1;i>=0;i--) { int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10; int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10; str=char(int1+'0')+str; } if (int2!=0) str=char(int2+'0')+str; } } //运算后处理符号位 if ((sign==-1)&&(str[0]!='0')) str="-"+str; return str; } string SUB_INT(string str1,string str2) {//高精度减法 int sign=1; //sign 为符号位 string str; int i,j; if (str2[0]=='-') { str=ADD_INT(str1,str2.erase(0,1)); } else { int res=compare(str1,str2); if (res==0) return "0"; if (res<0) { sign=-1; string temp =str1; str1=str2; str2=temp; } string::size_type tempint; tempint=str1.size()-str2.size(); for (i=str2.size()-1;i>=0;i--) { if (str1[i+tempint]<str2[i]) { j=1; while (1) {//zhao4zhong1添加 if (str1[i+tempint-j]=='0') { str1[i+tempint-j]='9'; j++; } else { str1[i+tempint-j]=char(int(str1[i+tempint-j])-1); break; } } str=char(str1[i+tempint]-str2[i]+':')+str; } else { str=char(str1[i+tempint]-str2[i]+'0')+str; } } for (i=tempint-1;i>=0;i--) str=str1[i]+str; } //去除结果中多余的前导0 str.erase(0,str.find_first_not_of('0')); if (str.empty()) str="0"; if ((sign==-1) && (str[0]!='0')) str ="-"+str; return str; } string MUL_INT(string str1,string str2) {//高精度乘法 int sign=1; //sign 为符号位 string str; if (str1[0]=='-') { sign*=-1; str1 =str1.erase(0,1); } if (str2[0]=='-') { sign*=-1; str2 =str2.erase(0,1); } int i,j; string::size_type L1,L2; L1=str1.size(); L2=str2.size(); for (i=L2-1;i>=0;i--) { //模拟手工乘法竖式 string tempstr; int int1=0,int2=0,int3=int(str2[i])-'0'; if (int3!=0) { for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr; for (j=L1-1;j>=0;j--) { int1=(int3*(int(str1[j])-'0')+int2)%10; int2=(int3*(int(str1[j])-'0')+int2)/10; tempstr=char(int1+'0')+tempstr; } if (int2!=0) tempstr=char(int2+'0')+tempstr; } str=ADD_INT(str,tempstr); } //去除结果中的前导0 str.erase(0,str.find_first_not_of('0')); if (str.empty()) str="0"; if ((sign==-1) && (str[0]!='0')) str="-"+str; return str; } string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1时,返回商; flag==0时,返回余数 string quotient,residue; //定义商和余数 int sign1=1,sign2=1; if (str2 == "0") { //判断除数是否为0 quotient= "ERROR!"; residue = "ERROR!"; if (flag==1) return quotient; else return residue ; } if (str1=="0") { //判断被除数是否为0 quotient="0"; residue ="0"; } if (str1[0]=='-') { str1 = str1.erase(0,1); sign1 *= -1; sign2 = -1; } if (str2[0]=='-') { str2 = str2.erase(0,1); sign1 *= -1; } int res=compare(str1,str2); if (res<0) { quotient="0"; residue =str1; } else if (res == 0) { quotient="1"; residue ="0"; } else { string::size_type L1,L2; L1=str1.size(); L2=str2.size(); string tempstr; tempstr.append(str1,0,L2-1); for (int i=L2-1;i<L1;i++) { //模拟手工除法竖式 tempstr=tempstr+str1[i]; tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加 if (tempstr.empty()) tempstr="0";//zhao4zhong1添加 for (char ch='9';ch>='0';ch--) { //试商 string str; str=str+ch; if (compare(MUL_INT(str2,str),tempstr)<=0) { quotient=quotient+ch; tempstr =SUB_INT(tempstr,MUL_INT(str2,str)); break; } } } residue=tempstr; } //去除结果中的前导0 quotient.erase(0,quotient.find_first_not_of('0')); if (quotient.empty()) quotient="0"; if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient; if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ; if (flag==1) return quotient; else return residue ; } string DIV_INT(string str1,string str2) {//高精度除法,返回商 return DIVIDE_INT(str1,str2,1); } string MOD_INT(string str1,string str2) {//高精度除法,返回余数 return DIVIDE_INT(str1,str2,0); } int main() { char ch; string s1,s2,res; while (cin>>s1>>ch>>s2) { switch (ch) { case '+':res=ADD_INT(s1,s2);break; case '-':res=SUB_INT(s1,s2);break; case '*':res=MUL_INT(s1,s2);break; case '/':res=DIV_INT(s1,s2);break; case '%':res=MOD_INT(s1,s2);break; default : break; } cout<<res<<endl; } return(0); }

a123456678 2019-12-02 01:58:23 0 浏览量 回答数 0

回答

二进制数有两个特点:它由两个基本字符0,1组成,二进制数运算规律是逢二进一。 为区别于其它进制数,二进制数的书写通常在数的右下方注上基数2,或加后面加B表示。 例如:二进制数10110011可以写成(10110011)2,或写成10110011B,对于十进制数可以不加注.计算机中的数据均采用二进制数表示,这是因为二进制数具有以下特点: 1) 二进制数中只有两个字符0和1,表示具有两个不同稳定状态的元器件。例如,电路中有,无电流,有电流用1表示,无电流用0表示。类似的还比如电路中电压的高,低,晶体管的导通和截止等。 2) 二进制数运算简单,大大简化了计算中运算部件的结构。 二进制数的加法和乘法运算如下: 0+0=0 0+1=1+0=1 1+1=10 0×0=0 0×1=1×0=0 1×1=1 由于二进制数在使用中位数太长,不容易记忆,所以又提出了十六进制数. ⑴二进制数转换成十进制数 [例](11111001001)2=1×210+1×29+1×28+1×27+1×26+0×25+0×24 +1×23+0×22+0×21+1×20 =(1993)10 (1011.101)2=1×23+0×22+1×21+1×20+1×2-1+0×2-2+1×2-3 =(11.625)10 ⑵十进制数转换成二进制数 ①十进制整数转换成二进制整数(除基(2)取余法) [例] 2 1993 2 996 …………1…………0位 低位二进制整数 2 498 …………0…………1位 2 249 …………0…………2位 2 124 …………1…………3位 2 62 …………0…………4位 2 31 …………0…………5位 2 15 …………1…………6位 2 7 …………1…………7位 2 3 …………1…………8位 2 1 …………1…………9位 0 …………1…………10位 高位二进制整数 注意,除到0商时结束2除步,回写(从高位回到低位)余数便是所求二进制数,即:(1993)10=(11111001001)2 ②十进制纯小数转换成二进制纯小数(乘基(2)取整法) [例] 0.625 2 2-1位… 1. 250 高位二进制小数 2 2-2位… 0. 500 2 2-3位 1.000 低位二进制小数 纯小数位被全乘为0时,得准确二进制纯小数;否则(纯小数位永远被2乘不为全是0)只能化成满足某一精确度要求的二进制小数的近似值。例中(0.625)10=(0.101)2是准确值,其中101是顺写的积整位(从高位到低位)数。

小哇 2019-12-02 01:29:20 0 浏览量 回答数 0

问题

关于位运算的判断问题

蛮大人123 2019-12-01 20:14:56 927 浏览量 回答数 2

回答

你说的应该是二进制数的算术运算吧。 二进制数的算术运算非常简单,它的基本运算是加法。在计算机中,引入补码表示后,加上一些控制逻辑,利用加法就可以实现二进制的减法、乘法和除法运算。 (1)二进制的加法运算 二进制数的加法运算法则只有四条:0+0=0 0+1=1 1+0=1 1+1=10(向高位进位) 例:计算1101+1011的和 由算式可知,两个二进制数相加时,每一位最多有三个数:本位被加数、加数和来自低位的进位数。按照加法运算法则可得到本位加法的和及向高位的进位。 (2)二进制数的减法运算 二进制数的减法运算法则也只有四条: 0-0=0 0-1=1(向高位借位) 1-0=1 1-1=0 例:计算11000011 00101101的差 由算式知,两个二进制数相减时,每一位最多有三个数:本位被减数、减数和向高位的借位数。按照减法运算法则可得到本位相减的差数和向高位的借位。 (3)二进制数的乘法运算 二进制数的乘法运算法则也只有四条: 0*0=0 0*1=0 1*0=0 1*1=1 例:计算1110×1101的积 由算式可知,两个二进制数相乘,若相应位乘数为1,则部份积就是被乘数;若相应位乘数为0,则部份积就是全0。部份积的个数等于乘数的位数。以上这种用位移累加的方法计算两个二进制数的乘积,看起来比传统乘法繁琐,但它却为计算机所接受。累加器的功能是执行加法运算并保存其结果,它是运算器的重要组成部分。 (4)二进制数的除法运算 二进制数的除法运算法则也只有四条: 0÷0=0 0÷1=0 1÷0=0(无意义) 1÷1=1 例:计算100110÷110的商和余数。 由算式可知,(100110)2÷(110)2得商(110)2,余数(10)2。但在计算机中实现上述除法过程,无法依靠观察判断每一步是否“够减”,需进行修改,通常采用的有“恢复余数法”和“不恢复余数法”,这里就不作介绍了。 二进制加减乘除和十进制的加减乘除类似,比如 求 (1110)2 乘(101)2 之积 解: ???1 1 1 0 × ?? 1 0 1 ----------------------- ??? 1 1 1 0 ?? 0 0 0 0 ?1 1 1 0 ------------------------- 1 0 0 0 1 1 0 (这些计算就跟十进制的加或者乘法相同,只是进位的数不一样而已,十进制的是到十才进位这里是到2就进了)

小旋风柴进 2019-12-02 01:28:33 0 浏览量 回答数 0

问题

bitmap一般如何取出其所表示的数据

蛮大人123 2019-12-01 20:16:32 1030 浏览量 回答数 1

回答

给你个java的代码你,希望对你有帮助 package standard.system; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.Random; public class RSACrypt { private static int _PrivateKey = 32823; // 私钥 private static int _PublicKey = 20643; // 公钥 private static int _Modulus = 29893; // 模数 // 对数字进行加密解密运算,根据key为公钥或是私钥来判断对数字进行加密或解密操作 private static int Crypt(int number, int key) { int mod; int i; int result = 0; try { mod = number * number % _Modulus; if (key % 2 == 0) { result = 1; for (i = 0; i < key / 2; i++) { result = mod * result % _Modulus; } } else { result = number; for (i = 0; i < key / 2; i++) { result = mod * result % _Modulus; } } } catch (Exception e) { } return result; } // 根据字符位置将字符的ASCII数值进行偏移,并得到密文 public static String Encode(String message) { int length = message.length(); // 明文的长度 int ascCode; // ASCII码 int cryptCode; // 密码 int rndCode; // 随机码 int index; String encodeString = ""; // 密文 if (length == 0) { return null; } // 产生随机码 Random rnd = new Random(); rndCode = 1 + rnd.nextInt(99); for (index = 0; index < length; index++) { // 获取单字符的ASCII码 ascCode = (int) message.charAt(index); // 同一字符根据随机码偏移保证每次不同 ascCode += rndCode; // 同一字符在不同位置保证不同 ascCode += index + 1; // 因索引值与domino不同(domino起始为1),所以此处加1 // 同一字符在字符串长度变化时保证不同 ascCode += length; ascCode = ascCode % 128; // 加密为密码 cryptCode = Crypt(ascCode, _PublicKey); // 将密码转换为4位16进制字符串 encodeString += DecimalToHex(cryptCode, 4); } // 最后附上随机码的2位16进制字符串 encodeString += DecimalToHex(rndCode, 2); return encodeString; } // 将密文转换为明文,再对明文进行字位偏移,最终得到原文 public static String Decode(String message) { int length = message.length() - 2; // 剥离随机码后的密文长度 int ascCode; // ASCII码 int cryptCode; // 密码 int rndCode; // 随机码 int index; String decodeString = ""; // 明文 // 获取随机码的10进制数字 rndCode = HexToDecimal(message.substring(length)); for (index = 0; index < length; index += 4) { // 将4位16进制字符串转换为10进制密码 cryptCode = HexToDecimal(message.substring(index, index + 4)); // 解密为明码 ascCode = Crypt(cryptCode, _PrivateKey); // 还原随机码偏移 ascCode -= rndCode; // 还原字位偏移 ascCode += (length / 4 % 128 + 1) * 128 - (index + 1) / 4 - 1; // 因索引值与domino不同(domino起始为1),所以此处加1 // 还原字符串长度偏移 ascCode += (length / 4 % 128 + 1) * 128 - length / 4; ascCode = ascCode % 128; // 将ASCII码转换为字符 decodeString += (char) ascCode; } return decodeString; } // 10进制数字转16进制字符串 private static String DecimalToHex(int decNumber, int hexWidth) { String hexString = Integer.toHexString(decNumber); while (hexString.length() < hexWidth) hexString = "0" + hexString; return hexString; } // 16进制字符串转10进制数字 private static int HexToDecimal(String hexString) { return Integer.parseInt(hexString, 16); } public static void main(String[] args) throws UnsupportedEncodingException { String str = "测试158228&&2008-10-23_15:39:58"; System.out.println(str); str = URLEncoder.encode(str, "UTF-8"); System.out.println(str); for (int i = 0; i < 10; i++) { String r = RSACrypt.Encode(str); System.out.println(r); System.out.println(URLDecoder.decode(RSACrypt.Decode(r), "UTF-8")); } } }

寒凝雪 2019-12-02 01:26:34 0 浏览量 回答数 0

回答

1.数组的声明方法(1): arrayObj = new Array(); //创建一个数组。代码如下:var arr1 = new Array();(2):arrayObj = new Array([size]) 创建一个数组并指定长度,注意不是上限,是长度。代码如下:var a = new Array(5);(3):arrayObj = new Array([element0[, element1[, ...[, elementN]]]]) 创建一个数组并赋值。代码如下:var a = new Array(["b", 2, "a", 4,]);(4):arrayObj = [element0, element1, ..., elementN] 创建一个数组并赋值的简写,注意这里中括号不表示可省略。代码如下:var a = ["b", 2, "a", 4,];(注):注意带“[]”与不带“[]”的区别代码如下:var a = new Array(5); //指创建长度为5的数组var a = new Array([5]); //指创建一个数组,长度为1,并且第一位是52.数组的常用方法3.数组的运算(传地址)代码如下:var t2=new Array();t2[0]=1;t2[1]=2;test2(t2); //传地址(数组)function test2(var2) {for(var i=0;ivar2[i]=var2[i]+1;}}for(var i=0;ialert(t2[i]);}ps:来源网络

元芳啊 2019-12-02 00:54:54 0 浏览量 回答数 0

回答

计算机里的数字本来就是用二进制存的,所以计算过程也都是二进制计算。利用一些位运算的特性,可以很容易计算1的个数。有一个很有意思的特性:随便给一个二进制数,比如n=,我们把它减一:n-1=。重新摆放一下观察: (n) (n-1)通过观察得出,n中为1的最低位是第3位,而n-1和n的低3位全都不同。如果进行“按位与”操作,即 n (n-1) = 。 (n) (n-1) (n (n-1))可以看到底3位都变成了0。如果你数学足够好,可以得出结论:[结论]要消除整数n最低位的1,可以使用 n = n (n-1)。如果觉得不相信,可以多试试几个数,或者再琢磨一下。利用结论,想要求二进制中有多少个1就很容易了:<pre t="code" l="cpp">int countBits(int n) { int count = 0; while(n != 0) { n = n (n-1); count++; } return count; }

玄学酱 2019-12-02 01:28:02 0 浏览量 回答数 0

回答

#include <stdio.h> int candp(int a,int b,int c) //数据处理函数,实现幂的取余运算 { int r=1; b=b+1; while(b!=1) { r=r*a; r=r%c; b--; } printf("%d\n",r); return r; } int fun(int x,int y) //公钥e与t的互素判断 { int=t; while(y) { t=x; x=y; y=t%y; } if(x==1) return 0; //x与y互素时返回0 else return 1; //x与y不互素时返回1 } void main() { int p,q,e,d,m,n,t,c,r; printf("请输入两个素数:p,q:"); scanf("%d%d",&p,&q); n=p*q; printf("计算得n为%3d\n",n); t=(p-1)*(q-1); //求n的欧拉数 printf("计算得t为%3d\n",t); printf("请输入公钥e:"); scanf("%d",&e); if(e<1||e>t||fun(e,t)) { printf("e不合要求,请重新输入:") //e<1或e>t或e与t不互素时,重新输入 scanf("%d",&e); } d=1; while(((e*d)%t)!=1)d++; //由公钥e求出私钥d printf("经计算d为%d\n",d); printf("加密请输入1\n"); //加密or解密选择 printf("解密请输入2\n"); scanf("%d",&r); switch(r) { case1:printf("请输入明文m:"); //输入要加密的明文数字 scanf("%d",&m); c=candp(m,e,n); printf("密文为%d\n",c);break; case2:printf("请输入密文c:"); //输入要解密的密文数字 scanf("%d",&c); m=candp(c,d,n); printf("明文为%d\n",m);break; } } RSA算法描述 1、选取长度相等的两个大素数p和q,计算其乘积: n=pq 然后随机选取加密密钥e,使e和(p-1)(q-1)互素。 最后用欧几里得拓展算法计算解密密钥d,以满足 ed=1(mod(p-1)(q-1)) 即 d=e-1mod((p-1)(q-1)) e和n是公钥,d是私钥 2、机密公式如下: ci=mi^e(modn) 3、解密时,取每一密文分组ci并计算: mi=ci^d(modn) Ci^d=(mi^e)^d=mi^(ed)=mi^[k(p–1)(q–1)+1]=mimi^[k(p–1)(q–1)]=mi*1=mi 4、消息也可以用d加密e解密 注意:此程序只是针对RSA算法的入门,无法达到安全要求的位数,谨慎使用。

寒凝雪 2019-12-02 01:26:50 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播