* Copyright (c) 2012, 烟台大学计算机学院学生
* All rights reserved.
* 作 者: 刘镇
* 完成日期: 2012 年 10 月 19 日
* 版 本 号: 3.010
* 对任务及求解方法的描述部分
* 问题描述:一个用移位和加法运算取代整数相乘的方法
*代码部分:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace shiftAdd
{
class Add
{
public int[] mark = new int[20];
public int num = 0;
public int m;
public Add()
{
for (int i = 0; i < 20; i++)
{
mark[i] = 0;
}
}
public void add()
{
for (int i = 0; m >= 2; i++)
{
mark[i] = m % 2;
num++;
m = m / 2;
}
mark[num] = 1;
num++;
}
public int shiftAdd(int n)
{
int all = 0;
this.add();
for (int i = 0; i < num; i++)
{
int save = 1;
if (mark[i] == 1)
{
save <<= i;
all += save;
}
}
return n * all;
}
}
class Program
{
static void Main(string[] args)
{
Add add = new Add();
add.m = 20;
Console.WriteLine(add.shiftAdd(5));
Console.ReadKey(true);
}
}
}
心得经验:
哈哈,做出来了,原来还可以这样做。终于想到了这种方法。
例:
num *= 32;
等同于
num <<= 5; /* 2 的 5 次方等于 32 */
如果乘数不是 2 的 n 次方,则可以把乘数分解成几个 2 的 n 次方的和:
num *= 20;
等同于
num *= (16 + 4);