无心人 发表于 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]
查看完整版本: 求bit位为1数目不超出2的正整数