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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2022-11-10 stm32 窗口看门狗
2021-11-10 cmake的简介与使用
2018-11-10 makefile 嵌套
2017-11-10 modbus 寄存器介绍