逖靖寒的世界
Share my world. Share your viewpoint.
博客园
社区
首页
新随笔
联系
管理
订阅
随笔- 106 文章- 13 评论- 879
如何高效求2个整数的乘积。
利用减治法的思想来实现,
将2个整数相乘只需要进行简单的加法和位运算。
实现如下:
1
using
System;
2
using
System.Collections.Generic;
3
using
System.Text;
4
5
namespace
ConsoleApplication43
6
{
7
class
Program
8
{
9
static
void
Main(
string
[] args)
10
{
11
ESCF e
=
new
ESCF();
12
13
int
s
=
e.GetResult(
10
,
10
);
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
(博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
网站首页
新闻频道
社区
小组
博问
网摘
闪存
找找看
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
相关文章:
《Windows用户态程序高效排错》
50个GMAIL申请,来吧来吧!
相关链接:
所属分类的其他文章:
C#实现遗传算法,模拟花朵的进化。
《Head First HTML with CSS and XHTML》 读后感
动态规划:利用WarShell算法求有向图的传递闭包
时空权衡:利用额外的空间提高字符串匹配的速度
变治法:用C#实现堆的建立与堆排序
如何高效求2个整数的乘积。
如何高效地判断奇数和偶数
编程实现1到N个数的所有排列组合
减治法:C#实现插入排序
分治法:用C#实现快速排序
最新IT新闻:
Google开拓美政府机构市场 微软业务受冲击
消息称苹果正在开发iTunes网络电视
微软周一开电话会议 预计将发布Silverlight2.0
开心网即将启用”shejiao.com”?
Google股价跌破329美元 61%员工期权价值归零
公告
我的最新闪存
君子不器
10-3 12:47
<
2007年11月
>
日
一
二
三
四
五
六
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
给我留言
查看留言
我管理的小组
Visual Studio
博客园仿真足球交流小组
我参加的小组
.NET 新手小组
程序员音乐空间
设计模式
python
ASP.NET
软件工程师日语
大连.NET俱乐部
Debug 探索团队小组
我参与的团队
大连.NET俱乐部(0/807)
Windows Embedded开发(0/99)
Debug 探索团队(0/53)
随笔分类
(150)
.NET 编程(26)
(rss)
ACM
(rss)
Python(4)
(rss)
Silverlight(2)
(rss)
TopCoder(3)
(rss)
博客园仿真足球竞赛平台(10)
(rss)
读书(17)
(rss)
个人制作(17)
(rss)
简历(1)
(rss)
软件设计(1)
(rss)
生活(36)
(rss)
算法(25)
(rss)
新手教程(2)
(rss)
英语(1)
(rss)
杂九杂十(5)
(rss)
随笔档案
(107)
2008年10月 (5)
2008年9月 (1)
2008年8月 (10)
2008年7月 (1)
2008年6月 (9)
2008年5月 (4)
2008年4月 (2)
2008年3月 (4)
2008年2月 (2)
2008年1月 (6)
2007年12月 (5)
2007年11月 (13)
2007年10月 (5)
2007年9月 (6)
2007年8月 (7)
2007年7月 (2)
2007年6月 (7)
2007年5月 (7)
2007年4月 (7)
2007年3月 (1)
2007年2月 (2)
2007年1月 (1)
文章档案
(12)
2007年5月 (1)
2007年4月 (10)
2007年2月 (1)
相册
My Photo
开源项目
AForge
A C# framework designed for developers and researchers in the fields of Computer Vision and Artificial Intelligence - image processing, neural networks, genetic algorithms, machine learning, etc.
朋友的博客
IT乌吉线
一起参加PH2008的队友
游戏AI
AI Game Dev
非常不错的一个网站,一直在更新。
Game/AI
有关游戏AI的一些评论
最新随笔
1. 第一次参加SRM
2. TopCoder Inv 2001 R1 200point
3. TopCoder SRM 152 div 2 500point
4. 基于silverlight 1.0的中国象棋游戏
5. 感叹Silverlight中的JavaScript智能感应
6. 了解博客园仿真足球竞赛平台的所有内部运行细节
7. 博客园仿真足球竞赛平台更新信息
8. 仿真足球队的整体的策略简单实现
9. 仿真足球最快截球的设计和实现
10. 深入理解整个比赛的执行流程
积分与排名
积分 - 130829
排名 - 301
最新评论
1. re: 博客园仿真足球竞赛平台基本原理分析
@1111
通过SOCKET通信。你看看范例球队就知道了;) (逖靖寒)
2. re: 博客园仿真足球竞赛平台基本原理分析
能详细说一下平台是如何将场上信息传递给球队的吗?也就是说平台将场上信息转换成什么形式来达到跟写决策层的代码的衔接 (1111)
3. re: 在VS2005下安装Boost 1.33
我按照上面的步骤做了,可到了第四步,执行批处理文件“build.bat”会执行不下去,报错为:不应有\utilities\bin\x86.不知是怎么回事?? (magician0303)
4. re: 基于silverlight 1.0的中国象棋游戏
@真见
对的,需要拖到棋子才能移动。
谢谢您的夸奖。 (逖靖寒)
5. re: 基于silverlight 1.0的中国象棋游戏
(真见)
阅读排行榜
1. 人工神经网络入门(1) —— 单层人工神经网络应用示例(4058)
2. 释放你的编程技能与激情--博客园仿真足球竞赛平台预览(3088)
3. C#实现遗传算法,模拟花朵的进化。(2930)
4. 使用NAnt构建入门(2830)
5. 如何高效地判断奇数和偶数(2748)
评论排行榜
1. 打印一个N位二进制数的所有表示(61)
2. Enjoy the Game(55)
3. 如何高效地判断奇数和偶数(49)
4. 释放你的编程技能与激情--博客园仿真足球竞赛平台预览(43)
5. 提高您的联系人查找体验,《Smart Contacts》发布(42)
60天内阅读排行
1. 释放你的编程技能与激情--博客园仿真足球竞赛平台预览(3088)
2. 博客园仿真足球竞赛平台基本原理分析(2299)
3. 如何利用CSharp球队模板编写自己的足球队(1633)
4. 仿真足球最快截球的设计和实现(1633)
5. 深入理解博客园仿真足球竞赛平台的仿真周期(1533)