最近日子過得很糾結(jié)啊 早上6:30跑到四工去占座 發(fā)現(xiàn)星期六 早上四工 6:00就開門了 好位子沒占到 幸好還是占到了2個(gè)空調(diào)房的座位 回來吃個(gè)早飯 開始鼎嵌杯 。。。第一題還算簡(jiǎn)單吧 ,1Y了,不過第二題就糾結(jié)了,CRC好辦,那個(gè)浮點(diǎn)數(shù)的轉(zhuǎn)化確實(shí)很麻煩,我只能硬著頭皮模擬之,IEEE32是啥?組原學(xué)過。。。只是一下子沒反應(yīng)過來和我們經(jīng)常用的那個(gè)IEEE753是一個(gè)東西。。。 代碼寫得很水 不知道有沒有什么改進(jìn)的方法?
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;

int crc=(1<<16)-1;//注意每一個(gè)case后crc要?dú)w位

#define xor 0xA001
void trans(int a)


{
crc=(a^crc);
int cnt=8;
while(cnt--)

{
if(crc%2==1)

{
crc=(crc>>1);
crc=(crc^xor);
}
else

{
crc=(crc>>1);
}
}

}

void myswap()


{
int i;
for(i=0;i<=7;i++)

{
if((crc&(1<<i))!=0&&(crc& ( 1<< (i+8 ) ) )==0)

{
crc-=1<<i;
crc+=1<< (i+8 ) ;
}
else if((crc&(1<<i))==0&&(crc& ( 1<< (i+8 ) ) )!=0)

{
crc+=1<<i;
crc-=1<< (i+8 );
}
}
}

int bin[100];
void tobin(unsigned int n)


{
memset(bin,0,sizeof(bin));
int p=-1;
while(n!=0)

{
p++;
bin[p]=n%2;
n/=2;
}
reverse(bin,bin+32);
}
char s[200];
char s2[200];//裝浮點(diǎn)數(shù)信息
char s3[200];//裝最后4位信息

int n;//記錄浮點(diǎn)數(shù)個(gè)數(shù)

void departstring(char s[])


{

int len=strlen(s);
n=(len-4)/8;
int i,j;
for(i=6,j=0;i<len-4;i++,j++)
s2[j]=s[i];
for(i=len-4,j=0;i<len;i++,j++)
s3[j]=s[i];
}

int getCRC(char s[])


{
char t[100];
crc=0xFFFF;
int nn=(strlen(s)-4)/2;
int i,j;
int tt;
int len=strlen(s);
for(i=0;i<len-4;i+=2)

{

t[0]=s[i];
t[1]=s[i+1];
t[2]='\0';
sscanf(t,"%X",&tt);
trans(tt);
}
myswap();
return crc;
}

double getfloatnum(int k)//取出第i個(gè)浮點(diǎn)數(shù),這里i從1到n


{

char t[200]=
{0};
int i,j;
for(i=(k-1)*8,j=0;i<(k-1)*8+8;i++,j++)
t[j]=s2[i];
unsigned int nn;
sscanf(t,"%X",&nn);
tobin(nn);
int exp=0;
for(i=8;i>=1;i--)

{

if(bin[i]==1)
exp+=(int)pow((double)2,8-i);
}
exp-=127;//獲得右移位數(shù)

int zhengshu=0;
double xiaoshu=0;

int dotpos=8+exp;//小數(shù)點(diǎn)在bin[pos]這一位后面

for(i=dotpos,j=0;i>8;i--,j++)

{
if(bin[i]==1)
zhengshu+=(int)pow((double)2,j);
}
zhengshu+=(int)pow((double)2,j);

for(i=dotpos+1,j=1;i<32;i++,j++)

{
if(bin[i]==1)
xiaoshu+=pow(0.5,j);
}
if(bin[0]==1)
return -(zhengshu+xiaoshu);
else return zhengshu+xiaoshu;
}




int main()


{
int a,b,c,d;
int zhengshu=0;
double xiaoshu=0;
double res;
int getcrc;


while(scanf("%d,%d,%d,%d",&a,&b,&c,&d)!=EOF)

{
int i,j;
memset(s,0,sizeof(s));
memset(s2,0,sizeof(s2));
memset(s3,0,sizeof(s3));
res=0;

int tem=0X00FF;
crc=(1<<16)-1;
trans(a);
trans(b);
trans((c>>8));
trans((c&tem));
trans((d)>>8);
trans((d&tem));
myswap();
printf("%02X%02X%04X%04X%04X\n",a,b,c,d,crc);



/**///////////////////////////////////////////////////////////////////////////
scanf("%s",s);
departstring(s);
getcrc=getCRC(s);
//printf("%X\n",getcrc);
int tt;
sscanf(s3,"%X",&tt);

if(tt!=getcrc)

{
printf("CRC_ERROR\n");
continue;
}

for(i=1;i<n;i++)
printf("%.1lf,",getfloatnum(i));
printf("%.1lf\n",getfloatnum(i));
}

return 0;
}
#define xor 0xA001 這個(gè)地方有點(diǎn)奇怪,如果我改成int xor=0xA0001,我的編譯器能過,但是交上去卻CE。。。
系統(tǒng)提示這個(gè):
Main.cpp
Main.cpp(10) : error C3193: '^' : requires '/clr' command line option
Main.cpp(10) : error C2059: syntax error : '='
Main.cpp(21) : error C2059: syntax error : ')'
算了,現(xiàn)在弄不明白了,下次再說吧,趕緊自習(xí)去。。。