软件乘法

来源:互联网 发布:淘宝一件代发平台 编辑:程序博客网 时间:2024/05/16 02:19
#include <stdint.h>#include <stdbool.h>uint64_t _soft_umul_bad(uint32_t a, uint32_t b){    uint64_t ret = 0;    int i, j;    for (i = 0; i < sizeof(a)*8; i++)        for (j = 0; j < sizeof(b)*8; j++)        {            ret += (uint64_t)((a & (1 << i)) && (b & (1 << j))) << (i + j);        }    return ret;}uint64_t _soft_umul(uint32_t a, uint32_t b){    uint64_t ret = 0, shift;    int i;    shift = b;    for (i = 0; i < sizeof(b)*8; i++)    {        if(a & (1 << i))        {            ret += shift;        }        shift <<= 1;    }    return ret;}int64_t _soft_mul(int32_t a, int32_t b){    bool neg_a, neg_b, neg_re;    int64_t ret;    neg_a = (a < 0);    neg_b = (b < 0);    neg_re = neg_a ^ neg_b;    a = neg_a ? (-a) : (a);    b = neg_b ? (-b) : (b);    ret = (int64_t)_soft_umul((uint32_t)a, (uint32_t)b);    return neg_re ? (-ret) : (ret);}#include <stdio.h>int main(int argc, char *argv[]){    int32_t a, b;    int64_t re_soft, re;    if (argc != 0)    {        fprintf(stderr, "softmul [num1] [num2]\n");        return -1;    }    sscanf(argv[1], "%d", &a);    sscanf(argv[2], "%d", &b);    re = (int64_t)a * b;    re_soft = _soft_mul(a, b);    printf("a = %d, b = %d\n", a, b);    printf("re = %lld, re_soft = %lld\n", re, re_soft);    return 0;}
0 0
原创粉丝点击