32位 进行64位除法

发布时间 2023-11-10 17:30:39作者: cogitoergosum
#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;
}