32位 进行64位除法
#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; }