#include "stdio.h"
#include <string.h>
typedef unsigned char uint8_t;
// typedef char int8_t;
typedef unsigned char u8;
typedef unsigned int u32;
typedef unsigned int uint32_t;
unsigned int div64_32(unsigned int a[], unsigned int b){
//假设你的64位数是一个32位数组,a[0]为低32位,a[1]为高32位
unsigned int i, j, k, m, c[2] = { 0 };
for (i = 2, j = k = 0; i; i--)
{
m = 0x80000000; //位探针,从最高位右移到最低位
for (; m; m >>= 1)
{
j = (k >= 0x80000000); //j为进位,k为余数
k <<= 1; //余数左移一位
k |= ((m&a[i - 1]) && 1); //将被除数当前位补进余数最低位
c[1] <<= 1; //商高位左移1位为低位左移溢出做准备
c[1] |= (c[0] >= 0x80000000); //低位左移溢出到高位
c[0] <<= 1; //低位左移一次准备做除法
c[0] |= (j || k >= b); //如果余数大于被除数则商低位补1
if (j)k = k + ~b + 1; //余数达到33位则“余数=当前余数+除数补码”
else if (k >= b)k -= b; //当前余数为32位且大于被除数则“余数=当前余数-除数”
}
}//64位除以32位运算完成,商在数组c中
a[0] = c[0];
a[1] = c[1]; //商以数组参数a返回
return k; //返回余数
}
int main(int argc, char const *argv[])
{
unsigned int a[2],b;
a[1] = 12032872500>>32 & 0xffffffff;
a[0] = 12032872500 & 0xffffffff;
printf("before:%x,%x\n", a[0], a[1]);
b = div64_32(a, 6003968); //2004
printf("余数:%d\n商:%u,%u",b, a[0], a[1]);
return 0;
}