本文链接:https://www.cnblogs.com/xiaohu12138/p/11955619.html

转载,请说明出处。

程序为简易实现补码一位乘法,若代码中存在错误,可指出,本人会不定期修改。

简易大纲:

代码实现:

package self_make;

import java.util.Scanner;

//补码一位乘法(布斯算法:booth algorithm)
public class booth_test {
static Scanner scanofX;
static Scanner scanofY;

public static void main(String[] args) {
//输入区

// 键入X值
while (true) {
System.out.print("请输入小于7位的定点数X:");
scanofX = new Scanner(System.in);
String x = scanofX.nextLine();
char X[] = x.toCharArray(); // 将字符串变成字符数组
char Xn[] = x.toCharArray();

// 检查输入的值是否符合
if (check(X) == false) {
continue;
}
// 键入Y值
System.out.print("请输入小于7位的定点数Y:");
scanofY = new Scanner(System.in);
String y = scanofY.nextLine();

char Y[] = y.toCharArray();
if (check(Y) == false) {
continue;
}

//初始化区
int ycount = 0; // 用于截取y值
int ccount = 0; // 用于记录移位乘法操作次数
char getfA[] = new char[5];

// 真值为负数
// [-X]补
if (X[0] == '-') {
Xn[0] = '0';
for (int i = 1; i <= X.length - 1; i++) {
if (Xn[i] == '1' & Xn[i] != '.') {
Xn[i] = '1';
} else if (Xn[i] == '0' & Xn[i] != '.') {
Xn[i] = '0';
} else {
Xn[i] = '.';
}
}
// [X]补
X[0] = '1';
int countx = 0; // 记录从右至左第一位数值为1的下标
for (int i = X.length - 1; i > 0; i--) {
if (X[i] == '1') {
X[i] = '1';
countx = i;
break;
}
}
// 下标左边按位取反
for (int i = 1; i < countx; i++) {
if (X[i] == '1' && X[i] != '.') {
X[i] = '0';
} else if (X[i] == '0' && X[i] != '.') {
X[i] = '1';
} else {
X[i] = '.';
}
}
// 下标右边不变
for (int i = countx; i <= X.length - 1; i++) {
if (X[i] == '1') {
X[i] = '1';
} else if (X[i] == '0') {
X[i] = '0';
}
}
System.out.print("[X]补为:");
for (int i = 0; i < X.length; i++) {
System.out.print(X[i]);
}
System.out.print("\t[-X]补为:");
for (int i = 0; i < Xn.length; i++) {
System.out.print(Xn[i]);
}
}
// 若真值为正数,正数补码为本身
else if (X[0] == '+') {
X[0] = '0';
System.out.print("[X]补为:");
for (int i = 0; i < X.length; i++) {
System.out.print(X[i]);
}
// 当乘数X真值为正时,对Xn进行操作
char Xn1[] = new char[Xn.length + 1];
for (int i = Xn.length - 2; i >= 0; i--) {
Xn1[i + 1] = Xn[i];
}
Xn[0] = '1';
int countXn = 0; // 记录从右至左第一位数值为1的下标
for (int i = Xn.length - 1; i > 0; i--) {
if (Xn[i] == '1' & Xn[i] != '.') {
Xn[i] = '1';
countXn = i;
break;
}
}
// 下标左边按位取反
for (int i = 1; i < countXn; i++) {
if (Xn[i] == '1' & Xn[i] != '.') {
Xn[i] = '0';
} else if (Xn[i] == '0' & Xn[i] != '.') {
Xn[i] = '1';
} else {
Xn[i] = '.';
}
}
// 下标右边不变
for (int i = countXn; i <= Xn.length - 1; i++) {
if (Xn[i] == '1' & Xn[i] != '.') {
Xn[i] = '1';
} else if (Xn[i] == '0' & Xn[i] != '.') {
Xn[i] = '0';
}
}
System.out.print("\t[-X]补为:");
for (int i = 0; i < Xn.length; i++) {
System.out.print(Xn[i]);
}
} else if (X[0] == '0') {
String xtemp = String.valueOf(X);
xtemp = "0" + xtemp;
X = xtemp.toCharArray();
System.out.print("[X]补为:");
for (int i = 0; i < X.length; i++) {
System.out.print(X[i]);
}
// Xn
Xn = xtemp.toCharArray();
Xn[0] = '1';
int countXn = 0; // 记录从右至左第一位数值为1的下标
for (int i = Xn.length - 1; i > 0; i--) {
if (Xn[i] == '1' & Xn[i] != '.') {
Xn[i] = '1';
countXn = i;
break;
}
}
// 下标左边按位取反
for (int i = 1; i < countXn; i++) {
if (Xn[i] == '1' & Xn[i] != '.') {
Xn[i] = '0';
} else if (Xn[i] == '0' & Xn[i] != '.') {
Xn[i] = '1';
} else {
Xn[i] = '.';
}
}
// 下标右边不变
for (int i = countXn; i <= Xn.length - 1; i++) {
if (Xn[i] == '1' & Xn[i] != '.') {
Xn[i] = '1';
} else if (Xn[i] == '0' & Xn[i] != '.') {
Xn[i] = '0';
}
}
System.out.print("\t[-X]补为:");
for (int i = 0; i < Xn.length; i++) {
System.out.print(Xn[i]);
}
}
System.out.println();

// Y值部分
if (Y[0] == '-') {
// 左移覆盖
for (int i = 0; i < Y.length - 2; i++) {
Y[i] = Y[i + 1];
}
Y[Y.length - 1] = 0;
Y[0] = '1';
for (int i = 0; i < Y.length; i++) {
if (Y[i] == 0) {
ycount = i;
}
}
int county = 0; // 记录从右至左第一位数值为1的下标
for (int i = ycount; i > 0; i--) {
if (Y[i] == '1') {
Y[i] = '1';
county = i;
break;
}
}
// 下标左边按位取反
for (int i = 1; i < county; i++) {
if (Y[i] == '1' & Y[i] != '.') {
Y[i] = '0';
} else if (Y[i] == '0' & Y[i] != '.') {
Y[i] = '1';
} else {
Y[i] = '.';
}
}
// 下标右边不变
for (int i = county; i <= ycount; i++) {
if (Y[i] == '1') {
Y[i] = '1';
} else if (Y[i] == '0') {
Y[i] = '0';
}
}
System.out.print("[Y]补为:");
for (int i = 0; i < Y.length; i++) {
System.out.print(Y[i]);
}
}
// 若真值为正数,正数补码为本身
else if (Y[0] == '0') {
ycount = Y.length;
System.out.print("[Y]补为:");
for (int i = 0; i < Y.length; i++) {
System.out.print(Y[i]);
}
} else if (Y[0] == '+') {
ycount = Y.length;
for (int i = 0; i < Y.length - 2; i++) {
Y[i] = Y[i + 1];
}
System.out.print("[Y]补为:");
for (int i = 0; i < Y.length; i++) {
System.out.print(Y[i]);
}

}

//计算区
char A[] = { '0', '0', '.', '0', '0', '0', '0' }; // 累加数
char C[] = new char[ycount + 1];//用于CnCn+1的数
for (int i = 0; i < ycount; i++) {
C[i] = Y[i];
}
C[C.length - 1] = '0';
System.out.print("\tC为:");
for (int i = 0; i < C.length; i++) {
System.out.print(C[i]);
}
//判断,计算,累加
for (int i = C.length - 2; i > 0; i--) {
if (C[i] == '0' & C[i + 1] == '0' | C[i] == '1' & C[i + 1] == '1') { // CnCn+1为00,11情况
// 右移
getfA[ccount] = A[A.length - 1];
for (int j = A.length - 1; j > 0; j--) {
A[j] = A[j - 1];
}
A[3] = A[0];
A[2] = '.';
ccount++;
} else if (C[i] == '0' & C[i + 1] == '1') { // CnCn+1为01情况
sum(A, X);
getfA[ccount] = A[A.length - 1];
// 右移
for (int j = A.length - 1; j > 0; j--) {
A[j] = A[j - 1];
}
A[3] = A[0];
A[2] = '.';
ccount++;
} else if (C[i] == '1' & C[i + 1] == '0') { // CnCn+1为10情况
sum(A, Xn);
getfA[ccount] = A[A.length - 1];
// 右移
for (int j = A.length - 1; j > 0; j--) {
A[j] = A[j - 1];
}
A[3] = A[0];
A[2] = '.';
ccount++;
} else if (C[i] == '.') {
if (C[i - 1] == '0' & C[i + 1] == '1') {
sum(A, X);
ccount++;
break;
} else if (C[i - 1] == '1' & C[i + 1] == '0') {
sum(A, Xn);
ccount++;
break;
} else {
break;
}
}
}
System.out.print("\n结果为:");
for (int i = 0; i < A.length; i++) {
System.out.print(A[i]);
}
for (int i = 0; i < getfA.length; i++) {
System.out.print(getfA[i]);
}
System.out.print("\n");
}
}

//累加函数,二进制加法
static public char[] sum(char a[], char b[]) {
char[] result = a;
int c = 0;//进位C
for (int i = b.length - 1; i >= 0; i--) {
if ('.' == (b[i])) {
result[i] = '.';
} else if (c == 0) {
if (a[i] == '1' & b[i] == '1') {
result[i] = '0';
c = 1;
} else if (a[i] == '1' & b[i] == '0') {
result[i] = '1';
c = 0;
} else if (a[i] == '0' & b[i] == '1') {
result[i] = '1';
c = 0;
} else if (a[i] == '0' & b[i] == '0') {
result[i] = '0';
c = 0;
}
} else if (c == 1) {
if (a[i] == '1' & b[i] == '1') {
result[i] = '1';
c = 1;
} else if (a[i] == '1' & b[i] == '0') {
result[i] = '0';
c = 1;
} else if (a[i] == '0' & b[i] == '1') {
result[i] = '0';
c = 1;
} else if (a[i] == '0' & b[i] == '0') {
result[i] = '1';
c = 0;
}
}
}
return result;
}

//检查函数,查看输入字符是否符合格式
static public boolean check(char[] a) {
boolean flag = true;// 用于记录字符是否合法
int countc = 0; // 记录'+' '-'号个数
int countd = 0; // 记录'.'
if (a.length >= 8) {
System.out.print("格式错误,请重新输入\n");
flag = false;
}
if (a[0] != '0' & a[0] != '+' & a[0] != '-') {
System.out.print("格式错误,请重新输入\n");
flag = false;
}
if (a[0] == '0') {
if (a[1] != '.') {
System.out.print("格式错误,请重新输入\n");
flag = false;
}
for (int i = 2; i < a.length; i++) {
if (a[i] != '0' & a[i] != '1') {
System.out.print("格式错误,请重新输入\n");
flag = false;
break;
}
}
}
if (a[0] == '+' | a[0] == '-') {
if (a[2] != '.') {
System.out.print("格式错误,请重新输入\n");
flag = false;
}
if (a[1] != '0' & a[1] != '1') {
System.out.print("格式错误,请重新输入\n");
flag = false;
}
for (int i = 3; i < a.length; i++) {
if (a[i] != '0' & a[i] != '1') {
System.out.print("格式错误,请重新输入\n");
flag = false;
break;
}
}
}
for (int i = 0; i < a.length; i++) {
if (a[i] == '+' & a[i] == '-') {
countc++;
}
}
if (countc > 1) {
System.out.print("格式错误,请重新输入\n");
flag = false;
}
for (int i = 0; i < a.length; i++) {
if (a[i] == '.') {
countd++;
}
}
if (countd > 1) {
System.out.print("格式错误,请重新输入\n");
flag = false;
}
return flag;
}
}

补码一位乘法 Booth算法 Java简易实现的更多相关文章

  1. 补码一位乘法(Booth算法,C语言实现)

    补码一位乘法 首先了解下什么是补码? 补码概念的理解,需要先从“模”的概念开始. 我们可以把模理解为一个容器的容量.当超出这个 容量时,会自动溢出.如:我们最常见到的时钟,其容量 是 12,过了 12 ...

  2. Booth算法: 补码一位乘法公式推导与解析

    以下讲解内容出自<计算机组成原理(第三版)>(清华大学出版社) 大二学生一只,我的计组老师比较划水,不讲公式推导,所以最近自己研究了下Booth算法的公式推导,希望能让同样在研究Booth ...

  3. java原码反码补码以及位运算

    原码, 反码, 补码的基础概念和计算方法. 对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 1. 原码 原码就是符号位加上真值的绝对值, 即 ...

  4. BOOTH 算法的简单理解

    学习FPGA时,对于乘法的运算,尤其是对于有符号的乘法运算,也许最熟悉不过的就是 BOOTH算法了. 这里讲解一下BOOTH算法的计算过程,方便大家对BOOTH的理解.        上图是BOOTH ...

  5. Booth算法

    Booth算法 算法描述(载自维基百科) 对于N位乘数Y,布斯算法检查其2的补码形式的最后一位和一个隐含的低位,命名为y-1,初始值为0.对于yi, i = 0, 1, ..., N - 1,考察yi ...

  6. Atitit 电子商务订单号码算法(java c# php js 微信

    Atitit 电子商务订单号码算法(java c# php js  微信 1.1. Js版本的居然钱三爷里面没有..只好自己实现了. 1.2. 订单号标准化...长度16位 1.3. 订单号的结构 前 ...

  7. BASE64,MD5,SHA,HMAC加密與解密算法(java)

    package com.ice.webos.util.security; import java.io.UnsupportedEncodingException; import java.math.B ...

  8. 位运算及在java中的应用整理

    计算机编码: 原码 符号位为0表示正数,为1表示负数: 其余各位等同于真值的绝对值. 如:0000 0000 0000 0010 =2,1000 0000 0000 0010 =-2 反码 符号位的用 ...

  9. 原码,补码,反码的概念及Java中使用那种存储方式

    原码,补码,反码的概念及Java中使用那种存储方式: 原码:原码表示法是机器数的一种简单的表示法.其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示 补码:机器数的补码可由原码得到.如果机器 ...

随机推荐

  1. 1626:【例 2】Hankson 的趣味题

    1626:[例 2]Hankson 的趣味题题解 [题目描述] Hanks 博士是 BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫 Hankson.现在,刚刚放学回家的 Hankson ...

  2. 获取 Django版本号的两种方式

    one k@ubuntu:~$ python Python ( , ::) [GCC ] on linux2 Type "help", "copyright", ...

  3. c++ 容器反转

    // reverse algorithm example #include <iostream> // std::cout #include <algorithm> // st ...

  4. chrome console控制台引入jquery库

    var jqueryJs=document.createElement('script');jqueryJs.setAttribute("type","text/Java ...

  5. databinding 填坑 绑定动作是延后生效

    binding = FragmentNewsMainLayout750Binding.inflate(inflater); homePageViewModel = new HomePageViewMo ...

  6. leetcode 560. Subarray Sum Equals K 、523. Continuous Subarray Sum、 325.Maximum Size Subarray Sum Equals k(lintcode 911)

    整体上3个题都是求subarray,都是同一个思想,通过累加,然后判断和目标k值之间的关系,然后查看之前子数组的累加和. map的存储:560题是存储的当前的累加和与个数 561题是存储的当前累加和的 ...

  7. smarty获得当前url的方法分享

    http://{$smarty.server.SERVER_NAME}/{$smarty.server.REQUEST_URI} 注释: 复制代码代码如下: {$smarty.server.SERVE ...

  8. SQL语法介绍

    一.Select 查询 语法: mysql> help selectName: 'SELECT'Description:Syntax:SELECT [ALL | DISTINCT | DISTI ...

  9. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_8.RabbitMQ研究-工作模式-发布订阅模式-生产者

    Publish/subscribe:发布订阅模式 发布订阅模式: 1.每个消费者监听自己的队列. 2.生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将 ...

  10. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_15-异常处理-异常处理流程

    右侧是框架报的异常 不可预知的,例如数据库连不上这一类的.可以在map中制定某些类的异常,如果找不到就最右边的 99999的, 系统对异常的处理使用统一的异常处理流程: 1.自定义异常类型. 2.自定 ...