/*
* 程序头部注释开始
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称:移位运算来避免乘法运算
* 作 者:薛广晨
* 完成日期:2012 年 10 月 15 日
* 版 本号:x1.0
* 对任务及求解方法的描述部分
* 输入描述:
* 问题描述: 移位运算的特点是速度快,使用移位运算来避免乘法运算是一种常用技巧。不过乘数必须都是正整数,而且必须至少有一个是 2 的 n 次方。例如:
num *= 32;
等同于
num <<= 5; // 2 的 5 次方等于 32
如果乘数不是 2 的 n 次方,则可以把乘数分解成几个 2 的 n 次方的和:
num *= 20;
等同于
num *= (16 + 4);
请设计一个用移位和加法运算取代整数相乘的方法。
* 程序输出:
* 程序头部的注释结束
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace xue
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入乘数:");
int x = int.Parse(Console.ReadLine());
Console.WriteLine("请输入被乘数:");
int y = int.Parse(Console.ReadLine());
Console.WriteLine("{0} * {1} = {2}", x, y, multiply(x, y));
Console.ReadKey();
}
public static int multiply(int x, int y)
{
int num = 0, n = 0;
int[] arr = new int[10];
for (int i = 0; y != 0; i++)
{
arr[i] = y % 2;
y = y / 2;
}
for (int i = arr.Length - 1; i >= 0; --i)
{
if (arr[i] == 1)
{
n = x << i;
num = num + n;
}
}
return num;
}
}
}
运行结果: