补码一位乘法 Booth算法 Java简易实现
本文链接: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简易实现的更多相关文章
- 补码一位乘法(Booth算法,C语言实现)
补码一位乘法 首先了解下什么是补码? 补码概念的理解,需要先从“模”的概念开始. 我们可以把模理解为一个容器的容量.当超出这个 容量时,会自动溢出.如:我们最常见到的时钟,其容量 是 12,过了 12 ...
- Booth算法: 补码一位乘法公式推导与解析
以下讲解内容出自<计算机组成原理(第三版)>(清华大学出版社) 大二学生一只,我的计组老师比较划水,不讲公式推导,所以最近自己研究了下Booth算法的公式推导,希望能让同样在研究Booth ...
- java原码反码补码以及位运算
原码, 反码, 补码的基础概念和计算方法. 对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 1. 原码 原码就是符号位加上真值的绝对值, 即 ...
- BOOTH 算法的简单理解
学习FPGA时,对于乘法的运算,尤其是对于有符号的乘法运算,也许最熟悉不过的就是 BOOTH算法了. 这里讲解一下BOOTH算法的计算过程,方便大家对BOOTH的理解. 上图是BOOTH ...
- Booth算法
Booth算法 算法描述(载自维基百科) 对于N位乘数Y,布斯算法检查其2的补码形式的最后一位和一个隐含的低位,命名为y-1,初始值为0.对于yi, i = 0, 1, ..., N - 1,考察yi ...
- Atitit 电子商务订单号码算法(java c# php js 微信
Atitit 电子商务订单号码算法(java c# php js 微信 1.1. Js版本的居然钱三爷里面没有..只好自己实现了. 1.2. 订单号标准化...长度16位 1.3. 订单号的结构 前 ...
- BASE64,MD5,SHA,HMAC加密與解密算法(java)
package com.ice.webos.util.security; import java.io.UnsupportedEncodingException; import java.math.B ...
- 位运算及在java中的应用整理
计算机编码: 原码 符号位为0表示正数,为1表示负数: 其余各位等同于真值的绝对值. 如:0000 0000 0000 0010 =2,1000 0000 0000 0010 =-2 反码 符号位的用 ...
- 原码,补码,反码的概念及Java中使用那种存储方式
原码,补码,反码的概念及Java中使用那种存储方式: 原码:原码表示法是机器数的一种简单的表示法.其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示 补码:机器数的补码可由原码得到.如果机器 ...
随机推荐
- Gym - 101955K Let the Flames Begin 约瑟夫环
Gym - 101955KLet the Flames Begin 说实话,没怎么搞懂,直接挂两博客. 小飞_Xiaofei的约瑟夫问题(Josephus Problem)3:谁最后一个出列 小飞_ ...
- 未能加载文件或程序集“Microsoft.SqlServer.Management.Sdk.Sfc, Version=11.0.0.0, Culture=neutral, PublicKeyToken...
刚开始看老师 用VS新建一个“ADO.NET 实体数据模型” 但是一直报错:未能加载文件或程序集“Microsoft.SqlServer.Management.Sdk.Sfc, Version=11. ...
- oracle查询消耗服务器资源SQL语句
1.查找最近一天内,最消耗CPU的SQL语句 SELECT ASH.INST_ID, ASH.SQL_ID, (SELECT VS.SQL_TEXT FROM GV$SQLAREA VS WHERE ...
- 第二章 c语言概述
一.#include指令和头文件 1.#include C预处理指令,C编译器在编译前对源代码做一些准备工作 2.stdio.h标准输入输出头文件,提供了关于输入输出的信息供编译器使用 头文件包含了建 ...
- OpenResty之指令与常用API
1. 指令 通过 Lua 编写 Nginx 脚本的基本构建块是指令.指令常用于指定 Lua 代码是几时执行的以及如何使用运行的结果.下图展示了指令执行的顺序. lua_capture_error_lo ...
- flutter 中 List 和 Map 的用法
list集合 在Dart中,数组是List对象,因此大多数人只是将它们称为List.以下是一个简单的Dart的List: 创建一个int类型的list List list = [10, 7, 23]; ...
- python中的cls到底指的是什么
python中的cls到底指的是什么,与self有什么区别? 2018年07月31日 11:13:09 rs勿忘初心 阅读数:7769 作者:秦风链接:https://www.zhihu.com/ ...
- Flask 静态文件缓存问题
大家好,今天才发现很多学习Flask的小伙伴都有这么一个问题,清理缓存好麻烦啊,今天就教大家怎么解决. 大家在使用Flask静态文件的时候,每次更新,发现CSS或是Js或者其他的文件不会更新. 这是因 ...
- Python3 继承
继承的好处:子类实现父类的全部功能 1.单继承 若父类和子类有共同的方法或属性,则子类对父类方法或属性进行覆盖 class ClassA: def __init__(self): self.a = ' ...
- Android 中View的工作原理
Android中的View在Android的知识体系中扮演着重要的角色.简单来说,View就是Android在视觉的体现.我们所展现的页面就是Android提供的GUI库中控件的组合.但是当要求不能满 ...