📄 ssp_u64.c
字号:
#ifdef __cplusplusextern "C"{#endif#include "syscfg.h"#include "aos.h"#define MASK_BITALLMASK 0xFFFFFFFF#define MASK_BIT32MASK 0x80000000#define MASK_BIT01MASK 0x00000001#define MASK_BITNMASK(x) (MASK_BITALLMASK << (32 - (x)))U32 aos_u64_mul32( U64 *pU64, U32 u32bit ){ U64 value; U64 tmpval; U32 count; U32 xbit; U32 record; if (NULL == pU64) { return AOS_FAIL; } value.ulHigh = 0; value.ulLow = 0; for (count = 31, xbit = MASK_BIT32MASK; count > 0; xbit >>= 1, count--) { if (u32bit & xbit) { record = pU64->ulLow & MASK_BITNMASK(count); record >>= (32-count); tmpval.ulHigh = (pU64->ulHigh << count) | record; tmpval.ulLow = pU64->ulLow << count; AOS_U64_ADD64(&value, &tmpval); } } if (u32bit & MASK_BIT01MASK) { AOS_U64_ADD64(&value, pU64); } *pU64 = value; return AOS_SUCC; }U32 aos_u64_div32( U64 *pU64, U32 u32bit ){ U64 value; U32 tmp; U32 tmphi0; U32 tmphi1; U32 tmplo0; U32 tmplo1; if((NULL == pU64) || (0 == u32bit)) { return AOS_FAIL; } if (pU64->ulHigh >= u32bit) { value.ulHigh = pU64->ulHigh/u32bit; tmp = pU64->ulHigh%u32bit; } else { value.ulHigh = 0; tmp = pU64->ulHigh; } tmphi0 = U32_BUTT/u32bit; tmphi1 = U32_BUTT%u32bit; tmplo0 = pU64->ulLow/u32bit; tmplo1 = pU64->ulLow%u32bit; value.ulLow = tmphi0*tmp + tmplo0; value.ulLow += ((tmphi1 + 1)*tmp + tmplo1)/u32bit; if (((tmphi1 + 1)*tmp + tmplo1)%u32bit >= u32bit/2) { value.ulLow += 1; } *pU64 = value; return AOS_SUCC; }U32 aos_u64_div32revise( U64 *pU64, U32 u32bit, U32*pulReviseVal ){ U64 value; U32 tmp; U32 tmphi0; U32 tmphi1; U32 tmplo0; U32 tmplo1; if (NULL == pU64 || 0 == u32bit) { return AOS_FAIL; } if (pU64->ulHigh >= u32bit) { value.ulHigh = pU64->ulHigh/u32bit; tmp = pU64->ulHigh%u32bit; } else { value.ulHigh = 0; tmp = pU64->ulHigh; } tmphi0 = U32_BUTT/u32bit; tmphi1 = U32_BUTT%u32bit; tmplo0 = pU64->ulLow/u32bit; tmplo1 = pU64->ulLow%u32bit; value.ulLow = tmphi0*tmp + tmplo0; value.ulLow += ((tmphi1 + 1)*tmp + tmplo1)/u32bit; if (NULL != pulReviseVal) { *pulReviseVal = ((tmphi1 + 1)*tmp + tmplo1)%u32bit; } *pU64 = value; return AOS_SUCC; }U32 aos_u64_div64( U64 *pU64_N, U64 *pU64_M ){ U64 result = {0,0}; U64 temp[64]; U64 tmp; U32 i; if(NULL == pU64_N || NULL == pU64_M) { return AOS_FAIL; } if((0 == pU64_M->ulHigh) && (0 == pU64_M->ulLow)) { return AOS_FAIL; } if(AOS_U64_COMPARE(pU64_N,pU64_M) < 0) { pU64_N->ulHigh = 0; pU64_N->ulLow = 0; return AOS_SUCC; } tmp = *pU64_M; for(i = 0; i < 64; i++) { temp[i] = tmp; AOS_U64_LSH(&tmp); if(AOS_U64_COMPARE(&tmp,pU64_N) > 0) { i++; break; } if(AOS_U64_COMPARE(&temp[i],&tmp) > 0) { i++; break; } } for( ;i > 0;i--) { if(AOS_U64_COMPARE(&temp[i-1],pU64_N) <= 0) { AOS_U64_SUB64(pU64_N,&temp[i-1]); if(i > 32) { result.ulHigh |= (0x01 <<(i - 32 -1)); } else { result.ulLow |= (0x01 << (i - 1)); } } } *pU64_N = result; return AOS_SUCC; }#ifdef __cplusplus}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -