|
本帖最后由 mdyblog 于 2014-12-24 09:48 编辑
buf_geom.sector_size;
blk_buf.cur_blklist->length;
的数值 是个很小的数值,可以用一个unsigned short表示。这样一个简单的除法如下。
- typedef unsigned long long u64;
- u64 div64mini(u64 a, unsigned short b)
- { register unsigned long a1=(unsigned long)(a>>32); unsigned long a2=(unsigned long )a;
- unsigned long a1v=a1/ b; a1 -= a1v*b;
- a1 <<= 16;
- unsigned long amv=a1/ b; a1 -= amv*b;
- a1 <<= 16;
- unsigned long a2v=a2/ b; a2 -= a1v*b;
- a2 += a1;
- unsigned long a3v=a2/ b;
- return (((u64)a1v)<<32) + (((u64)amv)<<16)+ (a2v+a3v);
- }
- const unsigned short sector_size=(unsigned short)(buf_geom.sector_size);
- const unsigned short length=(unsigned short)(blk_buf.cur_blklist->length);
- const d1=blk_buf.cur_filepos & (-sector_size);
- const d2=filepos - d1;
- if ( blk_buf.cur_filepos < filepos )
- { const n1 =div64mini(d2,sector_size);
- if(n1>0)
- { blk_buf.cur_blknum+=n1;
- const n2 = div64mini(cur_blknum, length);
- blk_buf.cur_blklist += n2;
- blk_buf.cur_blknum -= n2 * length;
- }
- blk_buf.cur_filepos = filepos;
- }
复制代码 |
|