* 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);