zelych, я так понял, ты решил прогонять по регистру x1_ и x2_, а потом делать что-то вроде свертки
по моему, это почти тоже самое, что сделать с самого начала x=x1_&x2, а потом
прогнать его через регистр, или я не прав?
int fu(int x1,int x2){
int a,b,c,d,i,j=0;
int x1_,x2_;
x1_=x1;
x2_=x2;
do{
/*ну здесь, вроде как, прогоняем по регистру x1_*/
a=0;
b=x1_&0x80000057;
for(i=0;i<32;i++){
if(b&1)
a++;
b>>=1;
}
x1_=(x1_>>1)&0x7fffffff; /*здесь, я так понял, должен мусор отсекаться*/
if(a&1)
x1_|=0x80000000;
/*то же самое с x2_*/
a=0;
b=x2_&0x80000057;
for(i=0;i<32;i++){
if(b&1)
a++;
b>>=1;
}
x2_=(x2_>>1)&0x7fffffff;
if(a&1)
x2_|=0x80000000;
a=0;
b=x1_&x2; /*а вот тут, мне кажется, очень большая вероятность получения нуля
возможно, я ошибаюсь*/
for(i=0;i<32;i++){
if(b&1)
a++;
b>>=1;
}
c=0;
b=x2_&x1; /*тут, соответственно, тоже*/
for(i=0;i<32;i++){
if(b&1)
c++;
b>>=1;
}
d=(d<<1)(a&1)^(c&1)^1); /*по-моему, тут довольно часто будут единицы получаться*/
}while(++j!=0x20);
return d;
}
int hash(int *b){
int x,y,i=0;
x=b[0];
do{
y=b[++i];
x=fu(x,y);
}while(i!=0x100);
return x;
}
---
P.S. возможно, ерунду нагнал, не было времени по-больше поковыряться, а потому, прошу сильно не ругать ;)
|