求大神给小妹我注释一下下面这段红 {MOD}字体代码(最好是每句都说明一下。这段程序是公农历转换程序中的一段。。

2019-07-15 14:12发布

void Conversion(bit c,uchar year,uchar month,uchar day)
{ //c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
uchar temp1,temp2,temp3,month_p;          //temp3 temp4分别表示春节距元旦的天数,公历日离元旦的天数
        uint temp4,table_addr;
        bit flag2,flag_y;
        temp1=year/16; //BCD->hex 先把数据转换为十六进制
        temp2=year%16;
        year=temp1*10+temp2;
        temp1=month/16;
        temp2=month%16;
        month=temp1*10+temp2;
        temp1=day/16;
        temp2=day%16;
        day=temp1*10+temp2;
        //定位数据表地址
        if(c==0)
        {
                table_addr=(year+0x64-1)*0x3;  //定位数据表地址 year 对应的年份表中的地址是(year+99)*3 如2010年其地址是327
        }
        else
        {
                table_addr=(year-1)*0x3;
        }
        //定位数据表地址完成
        //取当年春节所在的公历月份,年份表中第三字节 BIT6-5 表示春节的公历月份
        temp1=year_code[table_addr+2]&0x60;
        temp1=_cror_(temp1,5);                  //temp1循环右移5位
        //取当年春节所在的公历月份完成                  
        //取当年春节所在的公历日,年份表中第三字节 BIT4-0 表示当年春节所在的公历日
        temp2=year_code[table_addr+2]&0x1f;
        //取当年春节所在的公历日完成
        // 计算当年春年离当年元旦的天数,春节只会在公历1月或2月
        if(temp1==0x1)
        {
                temp3=temp2-1;          //假如春节在公历1月,且元旦是元月一日,则元旦离春节的天数为temp2-1天
        }
        else
        {
                temp3=temp2+0x1f-1;    //假如春节在公历2月,则元旦离春节的天数为 temp2+0x1f-1 天
        }
        // 计算当年春年离当年元旦的天数完成

        //计算公历日离当年元旦的天数,为了减少运算,用了两个表
        //day_code1[9],day_code2[3]
        //如果公历月在九月或前,天数会少于0xff,用表day_code1[9],
        //在九月后,天数大于0xff,用表day_code2[3]
        //如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1
        //如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1
        if (month<10)
        {
                temp4=day_code1[month-1]+day-1;           //0到8月某日距元旦的天数
        }
        else
        {
                temp4=day_code2[month-10]+day-1;           //9月开始的某一天距元旦的天数
        }
        if ((month>0x2)&&(year%0x4==0))
        { //如果公历月大于2月并且该年的2月为闰月,天数加1
                temp4+=1;
        }
        //计算公历日离当年元旦的天数完成

        //判断公历日在春节前还是春节后
if (temp4>=temp3)
        { //公历日在春节后或就是春节当日使用下面代码进行运算
                temp4-=temp3;
                month=0x1;
                month_p=0x1; //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月
                flag2=get_moon_day(month_p,table_addr);
                //检查该农历月为大月还是小月,大月返回1,小月返回0
                flag_y=0;
                if(flag2==0)temp1=0x1d; //小月29天
                else temp1=0x1e; //大月30天
                temp2=year_code[table_addr]&0xf0;         //年份数据表中第1字节BIT7-4为闰月,为0则这年无闰月,如为1,表示有闰月
                temp2=_cror_(temp2,4); //从数据表中取该年的闰月月份,如为0则该年无闰月,BIT3-0表示阴历1到4月的大小,1为大,0为小
                while(temp4>=temp1)
                {
                        temp4-=temp1;
                        month_p+=1;
                        if(month==temp2)
                        {
                                flag_y=~flag_y;
                                if(flag_y==0)
                                month+=1;
                        }
                        else month+=1;
                        flag2=get_moon_day(month_p,table_addr);
                        if(flag2==0)temp1=0x1d;
                        else temp1=0x1e;
                }
                day=temp4+1;
        }
        else
        { //公历日在春节前使用下面代码进行运算
                temp3-=temp4;
                if (year==0x0)
                {
                        year=0x63;c=1;
                }
                else year-=1;
                table_addr-=0x3;
                month=0xc;
                temp2=year_code[table_addr]&0xf0;
                temp2=_cror_(temp2,4);
                if (temp2==0)
                month_p=0xc;
                else
                month_p=0xd; //
                /*month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12*/
                flag_y=0;
                flag2=get_moon_day(month_p,table_addr);
                if(flag2==0)temp1=0x1d;
                else temp1=0x1e;
                while(temp3>temp1)
                {
                        temp3-=temp1;
                        month_p-=1;
                        if(flag_y==0)month-=1;
                        if(month==temp2)flag_y=~flag_y;
                        flag2=get_moon_day(month_p,table_addr);
                        if(flag2==0)temp1=0x1d;
                        else temp1=0x1e;
                }
                day=temp1-temp3+1;

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。