一个18位身份证校验计算函数
验证身份证号是否正确的公式、通过身份证号提取出生年月、性别、年龄等的公式汇总

身份证号验证:=IF(LEN(身份证号所在单元格)=0,"空",IF(LEN(身份证号所在单元格)=15,"老号",IF(LEN(身份证号所在单元格)<>18,"位数不对",IF(CHOOSE(MOD(SUM(MID(身份证号所在单元格,1,1)*7+MID(身份证号所在单元格,2,1)*9+MID(身份证号所在单元格,3,1)*10+MID(身份证号所在单元格,4,1)*5+MID(身份证号所在单元格,5,1)*8+MID(身份证号所在单元格,6,1)*4+MID(身份证号所在单元格,7,1)*2+MID(身份证号所在单元格,8,1)*1+MID(身份证号所在单元格,9,1)*6+MID(身份证号所在单元格,10,1)*3+MID(身份证号所在单元格,11,1)*7+MID(身份证号所在单元格,12,1)*9+MID(身份证号所在单元格,13,1)*10+MID(身份证号所在单元格,14,1)*5+MID(身份证号所在单元格,15,1)*8+MID(身份证号所在单元格,16,1)*4+MID(身份证号所在单元格,17,1)*2),11)+1,1,0,"X",9,8,7,6,5,4,3,2)=IF(ISNUMBER(RIGHT(身份证号所在单元格,1)*1),RIGHT(身份证号所在单元格,1)*1,"X"),"正确","错误"))))性别:=IFERROR(IF(MOD(VALUE(MID(身份证号所在单元格,17,1)),2)=1,"男","女"),"")年龄:=IFERROR(YEAR(NOW())-VALUE(MID(身份证号所在单元格,7,4)),"")出生年月日:=CONCATENATE(MID(身份证号所在单元格,7,4),"-",MID(身份证号所在单元格,11,2),"-",MID(身份证号所在单元格,13,2))是否农村青壮年(女16至45、男16至50):=IF(户口性质<>"农业户口","否",IF(AND(性别="女",G4>=16,G4<=45),"是",IF(AND(性别="男",G4>=16,G4<=50),"是","否")))照片插入:第一步:新建一寸照文件夹为“目标文件夹”,照片命名例:99人以内(01+姓名),999人以内(001+姓名)第二步:在基础信息表内输入公式:=”照片源地址”&\”&序号栏&姓名栏&”.jpg”输入公式后,把公式内所有的“\”都换为“\\”;序号要求:99人以内从01开始,999人以内从001开始;第三步:到WORD文档,建立表格,并使光标在照片格“插入”→“文档部件”→“域”→“includepicture”→域属性输入“123”→FN+ALT+F9→把先前输入的“123”删除,在邮件合并内找输入合并域,选择“照片栏”→FN+F9。
18位身份证号码验证公式及标准

18位身份证号码验证工具
计算依据及说明
根据《中华人民共和国国家标准》(GB 11643-1999)规定:
公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
地址码(1-6位):表示编码对象常住户口所在县(市、旗、区)的行政区划代码
生日码(7-14位):表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
例如:1981年05月11日就用19810511表示。
顺序码(15-17位):为同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。
其中奇数分给男性,偶数分给女性。
校验码(18位):是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
第十八位数字的计算方法为:
1.将前面的身份证号码17位数分别乘以不同的权数。
从第一位到第十七位的权数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2。
2.将这17位数字和其对应的权数分别相乘并加总。
3.用加总来和除以11,看余数是多少?
4余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。
其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。
5.通过上面得知,如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。
如果余数是10,身份证的最后一位号码就是2。
以上算法来源于网络,具体规范见国家相关标准。
EXCEL中判断身份证号的几个方法

EXCEL中判断身份证号是否正确的方法探讨身份证有15位和18位两种,身份证位数是否正确,我们可以用LEN函数判断。
但身份证上的日期是否合法:月份是否在1-12之间,日期是否在1-31之间,并且2月份只有28或29天,其他月份30或31天,都不能超过范围。
另外一般规定6岁以上才可以办理身份证,也就是年份也有一个超范围的可能性。
综合起来看,有三类错误:“身份证位数不对”、“月日错误”、“年份错误”。
假定身份证号码在B1单元格,下面的公式可以综合判断以上三种错误:=IF(OR(LEN(B1)=18,LEN(B1)=15),IF(LEN(B1)=18,IF(OR(MONTH(DATE(1*( MID(B1,7,4)),1*(MID(B1,11,2)),1*(MID(B1,13,2))))<>1*(MID(B1,11,2)),DAY(D ATE(1*(MID(B1,7,4)),1*(MID(B1,11,2)),1*(MID(B1,13,2))))<>1*(MID(B1,13,2) )),"月日错误",""),IF(LEN(B1)=15,IF(OR(MONTH(DATE(1*(MID(B1,7,2))+1900,1*(MID(B1 ,9,2)),1*(MID(B1,11,2))))<>1*(MID(B1,9,2)),DAY(DATE(1*(MID(B1,7,2))+190 0,1*(MID(B1,9,2)),1*(MID(B1,11,2))))<>1*(MID(B1,11,2))),"月日错误",""))),"身份证位数不对")&IF(AND(LEN(B1)=18,1*MID(B1,7,4)>YEAR(TODAY())-6),"年份错误","")公式首先对身份证长度进行判断,是否等于15位或18位,然后对18位和15位身份证分别判断月日是否合法,最后判断18位身份证的年份是否合法。
身份证截取出生日期的函数

身份证截取出生日期的函数身份证是我国居民身份的标志,是居民身份证明的重要凭据。
很多时候,我们需要从身份证号中抽取出生日期,以便进行本人身份认证或者进行年龄相关的验证。
这里,我们首先要做的是了解身份证号的结构。
在中国,现行的身份证号码共有18位,组成如下:1.6位:表示签发机关代码;2. 中间8位:表示出生日期;3.4位:表示顺序号;4.后1位:表示校验码。
据此,我们即可编写一个函数来从身份证号中抽取出生日期,包括出生年月日及当前年份,即可获得完整的出生日期:```def getBirthByIDNO(IDNO):# 从身份证号中截取出生日期birthday_str = IDNO[6:14]#取年份信息cur_year = datetime.datetime.now().year#取当前年份信息#据年份和出生信息获取完整的生日birthday =datetime.datetime.strptime({}-{}-{}format(cur_year,birthday_str[:4],birthday_str[4:]), %Y-%m-%dreturn birthday```在上面的代码中,首先我们采用`IDNO[6:14]`来从身份证号中截取出生日期的部分,然后获取当前的年份`cur_year`,最后使用`datetime.datetime.strptime`函数将前8位字符串拼接到年份上,再转换为`datetime`对象,就可以得到完整的出生日期。
该算法可以很好地实现从身份证中抽取出生日期,在实际应用中也有着重要作用,例如:用户在注册账号时,可以直接输入身份证号,系统就可以自动抽取出生日期,无需再输入,这样可以极大地提高用户体验。
此外,该算法还可以应用于社交网络等其他场景,例如:计算用户年龄,校验有效期等,这些行为通常都需要用到身份证号,也需要从身份证号中抽取出生日期。
因此,在实际应用中,用来从身份证号中抽取出生日期的函数具有重要意义,也可以帮助我们更好地应用身份证号。
和身份证有关的5个Excel函数公式

和身份证有关的5个Excel函数公式以下是一组和身份证有关的函数公式,如果你是财务人员或是一名HR,那就一起来看一下啦:1、查找重复身份证号码:=IF(COUNTIF(A:A,A2&"*")>1,"重复","")要点:在COUNTIF函数的第二参数后加上一个星号 &"*"。
COUNTIF函数在计算文本型数字时,会默认按数值型进行处理,但是Excel中的数字精度只有15位,并且身份证号码是18位,因此会把前15位相同的身份证全部识别为相同的内容。
在第二参数后加上一个星号 &"*",就是告诉Excel,要查找包含A2单元格内容的文本,通过这样变通的手段,COUTNIF函数就听话啦。
2、用出生年月来计算年龄:=DATEDIF(A4,TODAY(),"y")要点:DATEDIF函数用于计算两个日期之间的间隔。
用法是:=DATEDIF(开始日期,结束日期,指定要返回的类型)第三参数是Y,表示年,是M,就表示月。
TODAY函数返回系统当前的日期。
DATEDIF函数是隐藏函数,输入时没有屏幕提示,需要手工录入哦。
3、根据身份证号计算出生年月:=--TEXT(MID(A2,7,8),"0!/00!/00")要点:身份证号码中的第8位到15位是出生年月信息。
首先使用MID函数从A2单元格的第7位开始,提取出8个字符,得到类似19840727的结果。
再使用TEXT函数将这个字符串变成日期样式的文本,得到类似1984/07/27的结果。
由于TEXT函数的结果是文本型的内容,所以加上两个小减号 -- 就是计算负数的负数,通过四则运算,变成真正的日期序列。
公式也可以使用=--TEXT(MID(A2,7,8),"0-00-00"),原理是一样的。
Ecel函数公式大全

1、查找重复内容公式:=I F(C O U N T I F(A:A,A2)>1,"重复","")。
2、用出生年月来计算年龄公式:=T R U N C((D A Y S360(H6,"2009/8/30",F A L S E))/360,0)。
3、从输入的18位身份证号的出生年月计算公式:=CONCATENATE(MID(E2,7,4),"/",MID(E2,11,2),"/",MID(E2,13,2))。
4、从输入的身份证号码内让系统自动提取性别,可以输入以下公式:=I F(L E N(C2)=15,I F(M O D(M I D(C2,15,1),2)=1,"男","女"),IF(MOD(MID(C2,17,1),2)=1,"男","女"))公式内的“C2”代表的是输入身份证号码的单元格。
1、求和:=SUM(K2:K56) ——对K2到K56这一区域进行求和;2、平均数:=AVERAGE(K2:K56) ——对K2 K56这一区域求平均数;3、排名:=RANK(K2,K$2:K$56) ——对55名学生的成绩进行排名;4、等级:=IF(K2>=85,"优",IF(K2>=74,"良",IF(K2>=60,"及格","不及格")))5、学期总评:=K2*0.3+M2*0.3+N2*0.4 ——假设K列、M列和N列分别存放着学生的“平时总评”、“期中”、“期末”三项成绩;6、最高分:=MAX(K2:K56) ——求K2到K56区域(55名学生)的最高分;7、最低分:=MIN(K2:K56) ——求K2到K56区域(55名学生)的最低分;8、分数段人数统计:(1)=COUNTIF(K2:K56,"100") ——求K2到K56区域100分的人数;假设把结果存放于K57单元格;(2) =COUNTIF(K2:K56,">=95")-K57 ——求K2到K56区域95~99.5分的人数;假设把结果存放于K58单元格;(3)=COUNTIF(K2:K56,">=90")-SUM(K57:K58) ——求K2到K56区域90~94.5分的人数;假设把结果存放于K59单元格;(4)=COUNTIF(K2:K56,">=85")-SUM(K57:K59) ——求K2到K56区域85~89.5分的人数;假设把结果存放于K60单元格;(5)=COUNTIF(K2:K56,">=70")-SUM(K57:K60) ——求K2到K56区域70~84.5分的人数;假设把结果存放于K61单元格;(6)=COUNTIF(K2:K56,">=60")-SUM(K57:K61) ——求K2到K56区域60~69.5分的人数;假设把结果存放于K62单元格;(7)=COUNTIF(K2:K56,"<60") ——求K2到K56区域60分以下的人数;假设把结果存放于K63单元格;说明:COUNTIF函数也可计算某一区域男、女生人数。
身份证号码校验也可以利用excel函数公式完成
身份证号码校验也可以利用excel函数公式完成身份证号码校验也可以利用excel函数公式完成,无需vba编程。
一、18位身份证号码校验函数公式:=IF(LEN(B2)=18,IF(MID("10X98765432",MOD(SUM(MID(LEF T(B2,17),ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1)=RIGHT(B2,1),"通过","校验未通过"),"")二、15位身份证号码升18位函数公式:=IF(LEN(B2)=15,REPLACE(B2,7,,19)&MID("10X98765432",M OD(SUM(MID(REPLACE(B2,7,,19),ROW(INDIRECT("1:17")),1)*2^( 18-ROW(INDIRECT("1:17")))),11)+1,1),"")三、同时完成15位升位或18位校验的函数公式:=IF(LEN(B2)=18,IF(MID("10X98765432",MOD(SUM(MID(LEF T(B2,17),ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1)=RIGHT(B2,1),"通过","校验未通过"),IF(LEN(B2)=15,REPLACE(B2,7,,19)&MID("10X98765432",MOD( SUM(MID(REPLACE(B2,7,,19),ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1),""))以上公式中B2为身份证号码所在单元格。
身份证正确检验及验证公式
验证公式一=IF(LEN(H20)=18,IF(RIGHT(H20,1)="X",IF(CHOOSE(MOD(SUM(LEFT(RIGHT(H20,18) )*7 LEFT(RIGHT(H20,17))*9 LEFT(RIGHT(H20,16))*10 LEFT(RIGHT(H20,15))*5 LEFT(RIGHT(H20,14))*8 LEFT(RIGHT(H20,13))*4 LEFT(RIGHT(H20,12))*2LEFT(RIGHT(H20,11))*1 LEFT(RIGHT(H20,10))*6 LEFT(RIGHT(H20,9))*3LEFT(RIGHT(H20,8))*7 LEFT(RIGHT(H20,7))*9 LEFT(RIGHT(H20,6))*10LEFT(RIGHT(H20,5))*5 LEFT(RIGHT(H20,4))*8 LEFT(RIGHT(H20,3))*4LEFT(RIGHT(H20,2))*2),11)1,1,0,"X",9,8,7,6,5,4,3,2)=LEFT(RIGHT(H20,1)),"正确!","出错啦!"),IF(CHOOSE(MOD(SUM(LEFT(RIGHT(H20,18))*7 LEFT(RIGHT(H20,17))*9LEFT(RIGHT(H20,16))*10 LEFT(RIGHT(H20,15))*5 LEFT(RIGHT(H20,14))*8 LEFT(RIGHT(H20,13))*4 LEFT(RIGHT(H20,12))*2 LEFT(RIGHT(H20,11))*1LEFT(RIGHT(H20,10))*6 LEFT(RIGHT(H20,9))*3 LEFT(RIGHT(H20,8))*7LEFT(RIGHT(H20,7))*9 LEFT(RIGHT(H20,6))*10 LEFT(RIGHT(H20,5))*5LEFT(RIGHT(H20,4))*8 LEFT(RIGHT(H20,3))*4 LEFT(RIGHT(H20,2))*2),11)1,1,0,"X",9,8,7,6,5,4,3,2)=LEFT(RIGHT(H20,1))*1,"正确!","出错啦!")),IF(LEN(H20)=15,"老号,请注意!",IF(LEN(H20)=0,"缺号码","位数不对!")))验证公式二=MID("10X98765432",MOD(SUMPRODUCT(MID(H20,ROW(INDIRECT("1:17")),1)*2^(18 -ROW(INDIRECT("1:17")))),11) 1,1)=RIGHT(H20,1)身份证有15位和18位两种,身份证位数是否正确,我们可以用LEN函数判断。
Excel函数技巧:巧用Excel函数公式检验身份证号码
Excel函数技巧:巧用Excel函数公式检验身份证号码小编有话说:小编还是第一次了解到身份证的编码规则呢,原来并不复杂,根据这个编码规则,我们自己也可以辨别身份证的真假,太牛逼了!不过说真的,要是公司员工的身份证号码写错了,而我们还没发现,真的会给公司带来很大的麻烦,所以今天我们就来和大家分享一个核查身份证号码是否有错误的公式。
一般来说,身份证号码会出现两类错误,长度错误和内容错误。
出现错误的原因大多数都输入过程中发生的,对于长度错误来说,目前都是18位的号码,如果长度出现错误,比较容易发现,但是如果其中的某一个数字出现错误,那就非常难以发现,以后就有可能会造成一些严重的后果,因此,今天重点就是核查内容的正确性。
一、身份证号组成原理首先需要了解一点关于身份证号码的编码规则:18位身份证号码组成:ddddddyyyymmddxxsp共18位,其中:1-6位是地区编码,7-14为出生日期,15-17这三位是性别代码,最后一位是根据前面的17个数字得到的校验位。
校验位的计算规则比较复杂:(1)前十七位数字本体码加权求和公式S = Sum(Ai * Wi), i = 0, ... , 16,先对前17位数字的权求和Ai:表示第i位置上的身份证号码数字值Wi:表示第i位置上的加权因子Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2(2)计算模Y = mod(S, 11)(3)通过模得到对应的校验码Y: 0 1 2 3 4 5 6 7 8 9 10校验码: 1 0 X 9 8 7 6 5 4 3 2要检验一个身份证号码是否有误,原理就是按照这个规则计算出校验码,再与最后一位数字去比较,如果不一致就是有问题了。
对于这个规则理解起来还是比较费劲的,我们举个例子来看看:1、将前面的身份证号码17位数分别乘以不同的系数。
从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
身份证正确检验及验证公式
公式二出处
EXCEL提取身份证出生日期、性别、检验身份证号码正确性
中国居民身份证号码是一组特征组合码,原为15位,现升级为18位,其编码规则为:
15位:6位数字常住户口所在县市的行政区划代码,6位数字出生日期代码,3位数字顺序码。
18位:6位数字常住户口所在县市的行政区划代码,8位数字出生日期代码,3位数字顺序码和1位检验码。
假定身份证号码在B1单元格,下面的公式可以综合判断以上三种错误:
验证公式三
=IF(OR(LEN(B1)=18,LEN(B1)=15),IF(LEN(B1)=18,IF(OR(MONTH(DATE(1*(MID(B1,7,4)),1*(MID(B1,11,2)),1*(MID(B1,13,2))))<>1*(MID(B1,11,2)),DAY(DATE(1*(MID(B1,7,4)),1*(MID(B1,11,2)),1*(MID(B1,13,2))))<>1*(MID(B1,13,2))),"月日错误",""),IF(LEN(B1)=15,IF(OR(MONTH(DATE(1*(MID(B1,7,2))+1900,1*(MID(B1,9,2)),1*(MID(B1,11,2))))<>1*(MID(B1,9,2)),DAY(DATE(1*(MID(B1,7,2))+1900,1*(MID(B1,9,2)),1*(MID(B1,11,2))))<>1*(MID(B1,11,2))),"月日错误",""))),"身份证位数不对")&IF(AND(LEN(B1)=18,1*MID(B1,7,4)>YEAR(TODAY())-6),"年份错误","")
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个18位身份证校验计算函数
因需要对15位旧身份证号码进行升位和校验、查询处理,又没有搜索到现成的函数,于是自己写了一个简单的过程,希望能够帮得上需要的朋友。
本函数的功能单一,只能校验第18位号码是否正确或者取得第18位号码,其他功能留给大家自己扩展吧!
<%
' Version: 1.0.1
' Author: sfply(sfply@)
' Last Modified: 2004/7/17 12:03
' Src是身份证号码,可以是15位也可以是18位,15位时只能返回验证码方式使用
' iChk参数取值真假,真代表校验Src是否18位身份证,并且校验第18位是否正确号码而确定是否有效身份证,返回只值为true或false
' 假代表返回正确的校验码,返回值为(1~x)
dim myIdentify
myIdentify = "36050219781218133?"
response.write chkIdentiyCard(myIdentify,false)
Function chkIdentiyCard(Src,iChk)
dim myWi,myAi,mySrc(17),i,myCount
myAi = "10X98765432"
myWi = split("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2",",")
if iChk then
if len(Src) = 18 then
for i = 0 to 16
mySrc(i) = mid(Src,i+1,1)
myCount = myCount + mySrc(i) * myWi(i)
next
if mid(myAi,(mycount mod 11)+1,1) = right(Src,1) then
chkIdentiyCard = true '返回结果,TRUE为合法身份证验证码
else
chkIdentiyCard = false '返回结果,FALSE为非法身份证验证码
end if
else
chkIdentiyCard = false '因为不是18位身份证所以返回FALSE
end if
else
if len(Src) = 15 or len(Src) = 18 then
if len(Src) = 15 then Src = mid(Src,1,6) & "19" & mid(Src,7,9)
for i = 0 to 16
mySrc(i) = mid(Src,i+1,1)
myCount = myCount + mySrc(i) * myWi(i)
next
chkIdentiyCard = mid (myAi,(mycount mod 11)+1,1) '返回正确的验证码 else
chkIdentiyCard = false '输入不不是15位或18位身份证号
end if
end if
End Function
%>
关于身份证第18是怎么计算的,原理如下
根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。
顺序码的奇数分给男性,偶数分给女性。
校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
下面举例说明该计算方法。
15位的身份证编码首先把出生年扩展为4位,简单的就是增加一个19,但是这对于1900年出生的人不使用(这样的寿星不多了)
某男性公民身份号码本体码为34052419800101001,首先按照公式⑴计算:
∑(ai×Wi)(mod 11) (1)
公式(1)中:
i----表示号码字符从由至左包括校验码在内的位置序号;
ai----表示第i位置上的号码字符值;
Wi----示第i位置上的加权因子,其数值依据公式Wi=2(n-1)(mod 11)计算得出。
i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
ai 3 4 0 5 2 4 1 9 8 0 0 1 0 1 0 0 1 a1
Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
ai×Wi 21 36 0 25 16 16 2 9 48 0 0 9 0 5 0 0 2 a1
根据公式(1)进行计算:
∑(ai×Wi) =(21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2) = 189
189 ÷ 11 = 17 + 2/11
∑(ai×Wi)(mod 11) = 2
然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10:
∑(ai×WI)(m od 11) 0 1 2 3 4 5 6 7 8 9 10
校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2
根据上表,查出计算结果为2的校验码为所以该人员的公民身份号码应该为340524************。
a[0]*7+a[1]*9+a[2]*10+a[3]*5+a[4]*8+a[5]*4+a[6]*2+a[7]*1+a[8]*6+a[9 ]*3
+a[10]*7+a[11]*9+a[12]*10+a[13]*5+a[14]*8+a[15]*4+a[16]*2。