软件乘法

原创 2015年07月09日 10:15:09
#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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

赛软件 * 比赛 = 软件比拼(java版)

题目:  下列乘法算式中:每个汉字代表1个数字(1~9)。相同的汉字代表相同的数字,不同的汉字代表不同的数字。 赛软件 * 比赛  =  软件比拼 试编程确定使得整个算式成立的数字组合,如有多...
  • lqcjdx
  • lqcjdx
  • 2014年11月27日 15:33
  • 429

Android——我的第一个APP,乘法计算器

那天,因为只做出来一个两个数的乘法开心的让小伙伴们围观,后来觉得还是完善一下比较好,像什么输入判断啊,限制都没有,最要命的是别人会问能算除法吗?所以,小乖知识简单的做了一个非常简单的乘法计算器,以至于...
  • xdd19910505
  • xdd19910505
  • 2015年10月11日 20:33
  • 1265

c# - 乘法的实现

今天翻起来之前跟着例子敲得代码,突然觉得真心牛B: 看看
  • yuxuac
  • yuxuac
  • 2014年08月16日 00:08
  • 1493

位运算实现乘法运算

在回答本问题之前,先学习一些有关位运算的知识。 (1) 常用的等式: -n=~(n-1)=~n+1 (2) 获取整数n的二进制中最后一个1: n&~(n-1)或者n&(-n)。例如n=010100,则...
  • sxh850297968
  • sxh850297968
  • 2015年06月18日 12:18
  • 3184

js中两个数的乘法

(Number(isNum)*Number(isDj)).toFixed(2) 乘法用Number(isNum)*Number(isDj)执行就可以,如果不用碰上8或9等数字可能会出问题 toFi...
  • sprita1
  • sprita1
  • 2013年10月27日 01:05
  • 24018

俄罗斯乘法

俄罗斯乘法:           俄罗斯乘法是用于计算两个数相乘,一般多用于取模的情况,可以将其转化为快速幂的形式。 公式: 举个例子:计算 35*72 过程 35 72...
  • u011074149
  • u011074149
  • 2016年04月17日 16:51
  • 553

【计算机组成原理】定点乘法运算之补码一位乘法(Booth算法)

x * y = z 讨论已知x和y的情况下,怎么通过补码一位乘法方法得出z~~ 首先说下运算规则~ 和原码一位乘法不同的是,补码一位乘法的符号位是参加运算的~运算的所有的数包括得到的结果z都...
  • liuchuo
  • liuchuo
  • 2016年10月25日 13:48
  • 5879

用java实现的乘法口诀

//乘法口诀 class ChengFaBiao { public static void main(String[] args) { for(int x = 1; x ...
  • xgcfxl2011
  • xgcfxl2011
  • 2012年04月12日 23:26
  • 2116

解决js乘法bug

function accMul(arg1,arg2) { var m=0,s1=arg1.toString(),s2=arg2.toString(); try{m+=s1.split(".")[...
  • u013766398
  • u013766398
  • 2016年11月25日 17:35
  • 994

用SQL语句实现乘法口诀

 这个是用 T-SQL  实现的 Declare  @i Int         ,@j Int         ,@Out Varchar(5000) Set @i=1 Set @j=1   Set...
  • xinli_zhang
  • xinli_zhang
  • 2007年06月05日 14:28
  • 1328
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:软件乘法
举报原因:
原因补充:

(最多只允许输入30个字)