无心人
发表于 2009-2-4 22:00:12
明白你的意思了
考虑 斐波那契 数列 方式也不错啊
gxqcn
发表于 2009-2-4 22:16:26
那与用 ${ 1, 2, 3, 4, 6, 8, 12, 16, ..., 2^k, 3xx2^(k-1), 2^(k+1), ... }$ 系列的哪个更好?(至少容易四字节或16字节对齐)
无心人
发表于 2009-2-5 08:20:49
:lol
都不理想
shshsh_0510
发表于 2009-2-5 08:42:48
早上来了测试了一下,那个程序结果好像还对 :) ,测试代码: UINT32 i,b,e;
for (i=1 ; i<0xFFFFFFFF ; i++) {
b=GreaterEqualBit2_58F(i);
e=GreaterEqualBit2_SHSHSH(i);
if (b!=e) {
printf( "i=%d,G=0x%X,L=0x%X \n",i,b,e);
break;
}
}
生成数据代码:///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//m 1-2 ,2 bits :mark
// 0: at least 3 ones
// 1: 2 ones
// 2: 1 one
// 3: 0 one
//x 3-12 ,10 bits:
// when contains at least 2 ones ,then x= upper-one
// eg : 11001 - 100000 ,1001 - 10000 ,0011-0100
//y 13-22 ,10 bits:
// when contains2 ones, y= GreaterEqualBit2(first byte+1)
// eg :1010-1100 ,0011 -0100
//z 23-32 ,10 bits:
// when contains at least 3 ones , it is y =GreaterEqualBit2(first byte) ,so just return z<<24
// eg:0110010 -1000000,101011 -110000
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
int onescount(UINT32 n){
int i,r=0;
for (i=0;i<8;i++){
if (n & (1<<i)) {
r++;
}
}
return r;
}
int getmark(UINT32 n)
{
int t= onescount(n);
switch(t) {
case 0:
return 3;
case 1:
return 2;
case 2:
return 1;
default:
return 0;
}
}
int getx(UINT32 n){
//x 3-12 ,10 bits:
// when contains at least 2 ones ,then x= upper-one
// eg : 11001 - 100000 ,1001 - 10000 ,0011-0100
int i,ret=0;
int t =onescount(n);
if(t>1){
for(i=31;i>=0;i--){
if ( n & (1<<i) ) {
ret = 1<<(i+1);
break;
}
}
}
return ret;
}
int gety(UINT32 n){
//y 13-22 ,10 bits:
// when contains2 ones, y= GreaterEqualBit2(first byte+1)
// eg :1010-1100 ,0011 -0100
int ret=0;
int t =onescount(n);
if(t==2){
ret=GreaterEqualBit2_58F(n+1);
}
return ret;
}
int getz(UINT32 n){
//z 23-32 ,10 bits:
// when contains at least 3 ones , it is y =GreaterEqualBit2(first byte) ,so just return z<<24
// eg:0110010 -1000000,101011 -110000
int ret=0;
int t =onescount(n);
if(t>2){
ret=GreaterEqualBit2_58F(n);
}
return ret;
}
void gendata(){
UINT32 i,m,x,y,z;
printf( "\n---------------------------------------------------------------------\n");
for (i=0 ; i<256 ; i++){
m=getmark(i);
x=getx(i);
y=gety(i);
z=getz(i);
printf( "0x%08X,",(m<<30)+(x<<20)+(y<<10)+z);
if (! ((i+1)%8)) {
printf( "\n");
}
}
}
无心人
发表于 2009-2-5 09:04:04
:)
呵呵, 难为你写这么多数据的
页:
1
2
3
4
5
6
7
8
9
10
[11]