TA的每日心情 | 郁闷 2025-2-20 09:41 |
---|
签到天数: 1704 天 连续签到: 1 天 [LV.Master]伴坛终老
|
本帖最后由 nemon 于 2013-2-22 12:53 编辑
今天看到昨天qq群里有人提问说:
两个64位的无符号类型做除法,编译器老是报错
定义了一个64位的无符号类型,typedef unsigned long long uint_64;
uint_64 tps = 从其它变量复制过来的一个32位数;
uint_64 tmp = 从其它变量复制过来的一个64位数;
uint_64 tmp2 = tmp / tps;
他要找除法的算法,@张叁给找了个汇编的,可是好像还不够用。
鄙人抛块砖吧:- __int64 my_div(__int64 *i1,__int64 *i2){//这里所有数字都是64位的
- __int64 i_i,i_r;
- i_r=0;
- for(i_i=64-1;i_i>=0;i_i--)//从最高的63位开始一直到最低的0位
- {
- i_r<<=1;
- if((*i1)>=((*i2)<<i_i))//本级如果够除
- {
- i_r+=1;
- (*i1)-=((*i2)<<i_i);
- }
- }
- return i_r;//返回除的结果,如果需要,这时候的(*i1)是余数
- }
复制代码 思想和汇编的一样,性能差点。
又想到实际上不用把64位都过一遍,于是:- typedef unsigned __int64 my_int;
- unsigned char my_div(my_int *i1,my_int *i2){//这里所有数字8、16、32、64位的就都可以了
- my_int i_r;
- char i_i=0;
- if(*i2)
- {
- while((*i1)>((*i2)<<i_i) )i_i++;
- for(i_r=0,i_i--;i_i>=0;i_i--)//从可能的最高位开始一直到最低的0位
- {
- i_r<<=1;
- if((*i1)>=((*i2)<<i_i))//本级如果够除
- {
- i_r+=1;
- (*i1)-=((*i2)<<i_i);
- }
- }
- (*i2)=i_r;
- return 0;//返回:这时候(*i1)是余数,(*i2)是除的结果
- }
- else
- {
- return 1;//出错了
- }
- }
复制代码 大家拿玉来砸吧……克拉大钻更好
|
|