我需要求一整形变量的位长,如3的位长是2“11(二进制)”
我的代码如下:
if(i < 0)
i = -1 * i;
length = 0;
while(i != 0)
{
i = i >> 1;
length ++;
};
i为整形变量,length为位长,由于该断代码在程序中反复调用,有没有办法可以做到比我这段代码效率更高(我已做成宏了,但速度没见高多少).
我的代码如下:
if(i < 0)
i = -1 * i;
length = 0;
while(i != 0)
{
i = i >> 1;
length ++;
};
i为整形变量,length为位长,由于该断代码在程序中反复调用,有没有办法可以做到比我这段代码效率更高(我已做成宏了,但速度没见高多少).
for(length=0;(i>>=1)!=0;length++)
{
}
for的效率 比 while的 效率高!
或者
内嵌ASSEMBLY,ASSEMBLY的执行效率是很高的,
下标:值
0: 1
1: 11
2: 111其余类推。这个数组的作为mask,通过二酚的方法用mask对证书进行检测,一个32位的证书,
最多检测5次。
http://www.betajin.com/alphasun/index.htm
DocWizard C++程序文档自动生成工具 | Wave OpenGL | HttpProxy | AjaxParser词法分析
{
unsigned char *pb = (unsigned char *)✓ for (int i = 3; pb[i] == 0; i --) {};
int length = (i << 3) + list[ pb[i] ]; cout << "length = " << length << endl;
}
i = -1 * i;
length = 0;
char temp[16]="";
sprintf(temp,"%x",i);
int temp_len=strlen(temp);
if(temp[0]>=0x38) length = temp_len*4;
else if(temp[0]>0x34) length = temp_len*4-1;
else if(temp[0]>0x32) length = temp_len*4-2;
else length = temp_len*4-3;
{
unsigned char *pb = (unsigned char *)✓
for (int i = 3; i > 0 && pb[i] == 0; i --) {};
length = (i << 3) + list[ pb[i] ];
}cout << "length = " << length << endl;
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; inline int _length8(unsigned char v8)
{
return list[v8];
}inline int _length16(unsigned short v16)
{
return (v16 > 255) ? 8 + _length8(v16 >> 8) : _length8(v16);
}inline int _length32(unsigned int v32)
{
return (v32 > 65535) ? 16 + _length16(v32 >> 16) : _length16(v32);
}
static int list[256] = { 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; int returnbitvalue(unsigned m)
{
if(m<=0xff)
return list[m];
else if(m<=0xffff)
return list[m>>8]+list[m&0xff00]
else if(m<=0xffffff)
return list[m>>16]+list[m&(0xff<<16]+list[m&(0xff<<8]
else if(m<=0xffffffff)
return list[m>>24]+list[m&(0xff<<0xff000000]+list[m&0xff0000]+list[m&0xff00];
}具体位置根据你实际的概率。
我的数组只有 32 个元素,因为32位的mask,只要 32 个。
if(i < 0)
i = -i;
length = 0;
while(i != 0)
{
i = i >> 1;
length ++;
};可以少一个字节
//mask数组准备DWORD aMask[31];
int i=31;
DWORD w = -1;
while(i>=0)
{
aMask[i--] = w>>1;
}//////////////////////////////////////////////
// 计算位长
int a=31, b=0, m;
DWORD dwTest; // 测试这个整数
while(a-b>1)
{
m=(a+b);
m = m>>1;
if(dwTest & aMask[m])
b = m;
else
a = m;
}int nLen = b+1; // 这就是最后的位长度
//mask数组准备DWORD aMask[31];
int i=30;
DWORD w = -1;
while(i>=0)
{
aMask[i--] = w>>1;
}
我是要对一组图像做JPEG无损压缩,大小是1k*1k*100frames,现在能做到10s左右,总觉得还可以在快一些,我知道优化应当在算法流程和结构上下功夫,但总想不出更好的解决途径,只好在语法上解决,但这样做不会导致效率的大幅度提高。我见到一国外的软件自称能做到30帧/s,感觉差距好大亚,汗。难道非得用汇编吗?我大部分的运算已经是位操作了,总感觉用汇编相差也不会很大
int iret;
_asm{
mov edx v
mov eax 32
loop:
shl edx
dec eax
gz loop
mov iret eax
}
return iret;
}
不好意思,在下理解错误了!
只要判断到最大一位位置就可以了。
二分查找的速度快!
{
//vc中的汇编代码
}
或
__asm mov ....
__asm .......//汇编代码
int fn(long value){
int num;
_asm{
mov eax,0
mov edx,value
add edx,0
jz exit
isnotzero:
inc eax
shr edx,1
jnz isnotzero
exit:
mov num, eax
}
return num;
}
不过我还要提醒你几句,这样的优化对你“一组图像做JPEG无损压缩”来说,不见得能有多少提高。像这种问题最关键还是算法,你应该先找一个优良的算法,然后再考虑编码的优化,而编码优化由谈何容易,内存分页,线程调度,cpu的指令预测,高速缓存命中,所有这些都会使看似优化的代码在执行是莫名其妙的要用很多时间。
int yourNumber = 100;
int yourResult = 0;_itoa(yourNumber, tempStr.GetBuffer(20), 2);//将整型数据转换成二进制的字符串,
//如3转换成“11”,然后获取长度就可以了,如果位数多,可用_ltoa()函数等;
tempStr.ReleaseBuffer(-1);
yourResult = tempStr.GetLength();这几行代码没有测试,如果只要实现获取位数的功能的话,是完全可以实现的,不需要用循环和判断,效率应该是很客观的。