如何高效求2个整数的乘积。

利用减治法的思想来实现,
将2个整数相乘只需要进行简单的加法和位运算。
实现如下:

 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4
 5namespace ConsoleApplication43
 6{
 7    class Program
 8    {
 9        static void Main(string[] args)
10        {
11            ESCF e = new ESCF();
12
13            int s = e.GetResult(1010);
14
15            System.Console.WriteLine(s);
16
17            s = e.GetResult(1043-1022);
18
19            System.Console.WriteLine(s);
20        }

21    }

22
23    /// <summary>
24    /// 判断一个整数是奇数还是偶数。
25    /// </summary>

26    class OddEven
27    {
28        static private int _s = 1;
29
30        static public bool IsEven(int a)
31        {
32            return ((a & _s) == 0);   
33        }

34
35        static public bool IsOdd(int a)
36        {
37            return !IsEven(a);
38        }

39    }

40
41    class ESCF
42    {
43        private int _small;
44        private int _big;
45
46        private bool _minus;
47
48        private void init(int a, int b)
49        {
50            int f = 0;
51
52            if (a < 0) f++;
53            if (b < 0) f++;
54
55            if (f == 0 || f == 2) _minus = false;
56            else _minus = true;
57            
58            a = Math.Abs(a);
59            b = Math.Abs(b);
60
61            _small = a <= b ? a : b;
62            _big = a > b ? a : b;   
63        }

64
65        public int GetResult(int a, int b)
66        {
67            init(a, b);
68
69            int reslut = 0;
70
71            while (_small != 1)
72            {
73                if (OddEven.IsEven(_small))
74                {
75                    _small >>= 1;
76                    _big <<= 1;
77                }

78                else
79                {
80                    _small--;
81                    reslut += _big;
82
83                    _small >>= 1;
84                    _big <<= 1;
85                }

86            }

87
88            reslut += _big;
89
90            if (_minus)
91                reslut = -reslut;
92
93            return reslut;
94        }

95    }

96}

97


 

posted @ 2007-11-21 15:02 逖靖寒 阅读(399) 评论(4)  编辑 收藏 所属分类: 读书算法

  回复  引用    
#1楼 2007-11-21 16:29 | testtest [未注册用户]
test
  回复  引用  查看    
#2楼 2007-11-21 16:35 | Silent Void      
在C中,编写跑在普通的X86处理器(连MMX指令都不支持的)上的程序,这种写法的确还不错;但在C#中,这种写法没什么太大意义吧...

即使我们按照普通的乘除法写法,JIT在编译生成本机机器指令时,会针对具体处理器的寄存器、支持的指令集进行优化(据称是这样),可能只需在几个CPU时钟周期内即可完成计算,但按照这种乘法拆成移位+加法的方式,要生成多少指令,花费多少CPU时钟周期呢?

楼主可以搜下《不同CPU架构如何影响浮点运算性能》,了解下更“复杂”的浮点数运算...


  回复  引用  查看    
#3楼 [楼主]2007-11-22 14:00 | 逖靖寒      
可以用以下代码对效率进行测试:
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication44
{
class Program
{
static void Main(string[] args)
{
int a = -25547788;
int len = 500000;
int c1 = 543;
int c2 = 188;
int c;
ESCF e = new ESCF();

DateTime start1 = DateTime.Now;

for (int i = 0; i < len; i++)
{
c = e.GetResult(c1, c2);
}

TimeSpan ts1 = DateTime.Now - start1;

Console.WriteLine("使用位操作的时间:" + ts1.TotalMilliseconds);

DateTime start2 = DateTime.Now;

for (int i = 0; i < len; i++)
{
c = c1 * c2;
}

TimeSpan ts2 = DateTime.Now - start2;

Console.WriteLine("使用求模操作的时间:" + ts2.TotalMilliseconds);
}
}

/// <summary>
/// 判断一个整数是奇数还是偶数。使用位操作
/// </summary>
static class OddEven
{
static public bool IsEven(int a)
{
return ((a & 1) == 0);
}

static public bool IsOdd(int a)
{
return !IsEven(a);
}
}

/// <summary>
/// 判断一个整数是奇数还是偶数。使用求模操作
/// </summary>
static class Mod2
{
static public bool IsEven(int a)
{
return ((a % 2) == 0);
}

static public bool IsOdd(int a)
{
return !IsEven(a);
}
}

class ESCF
{
private int _small;
private int _big;

//private bool _minus;

private void init(int a, int b)
{
//int f = 0;

//if (a < 0) f++;
//if (b < 0) f++;

//if (f == 0 || f == 2) _minus = false;
//else _minus = true;

//a = Math.Abs(a);
// b = Math.Abs(b);

_small = a <= b ? a : b;
_big = a > b ? a : b;
}

public int GetResult(int a, int b)
{
init(a, b);

int reslut = 0;

while (_small != 1)
{
if (OddEven.IsOdd(_small))
{
_small--;
reslut += _big;
}

_small >>= 1;
_big <<= 1;
}

reslut += _big;

//if (_minus)
// reslut = -reslut;

return reslut;
}
}
}

  回复  引用  查看    
#4楼 [楼主]2007-11-22 14:01 | 逖靖寒      
@Silent Void
谢谢你的指教,这种写法的效率我刚刚测试过了,比自带的慢了上百倍,唉~~

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: