利用 Java 和 Python 分别编写一个计算机原码、反码以及补码计算器

Author Avatar
Login926 12月 18, 2016

对于一个数, 计算机要使用一定的编码方式进行存储。原码, 反码, 补码是机器存储一个具体数字的编码方式。近期学习 Java 和编码知识,正好把两个结合起来。
封面是酥饼大人哦,圣诞快乐

原码

原码共 8 位,首位为符号位,正数首位为 0 ,负数首位为 1。
原数字取绝对值后转换为二进制,用 0 补空,填入剩余七位,最后得到原码。
所以取值范围为 [-127,127]

反码

正数反码就是原码。
负数反码是除符号位外原码取反,即 0 变 1 ,1 变 0 。

补码

正数补码就是原码。
负数补码在反码的基础上 +1 即可得到。

举几个例子:

十进制数 二进制数 原码 反码 补码
1 1 00000001 00000001 00000001
96 1100000 01100000 01100000 01100000
-3 -11 10000011 11111100 11111101
-107 -1101011 11101011 10010100 10010101

1.Java 实现

java 中有现成的函数可以实现十进制转二进制,不过我编程的时候并没有使用,而是使用了循环来进行十进制转二进制,整个程序可以分为三大块,计算二进制和原码、计算反码和计算补码部分,分别使用三个函数可以使程序更为清晰。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import java.util.Scanner;
public class ComputerCode {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Java 十进制数原码、反码、补码计算器");
int dec = 0;
//一个判断模块,判断输入是否符合要求
do{
System.out.println("请输入一个十进制数字([-127 , 127]范围内)");
dec = input.nextInt();
}while(dec<-127||dec>127);
//计算二进制数和原码
int[] YuanM = Dec2Bin(dec);
System.out.print(dec+"的二进制原码为:");
for (int i=0;i<YuanM.length;i++){
System.out.print(YuanM[i]);
}
System.out.println("");
//计算反码
int[] FanM = Fan(YuanM,dec);
System.out.print("二进制反码为:");
for (int i=0;i<FanM.length;i++){
System.out.print(FanM[i]);
}
System.out.println("");
//计算补码
int[] BuM = Bu(YuanM,dec);
System.out.print("二进制补码为:");
for (int i=0;i<BuM.length;i++){
System.out.print(BuM[i]);
}
System.out.println("");
}
//计算二进制数和原码函数
public static int[] Dec2Bin(int dec){
int[] Bin =new int[8];
//确定符号位
if (dec >= 0){
Bin[0]=0;
}
else{
Bin[0]=1;
//负数取绝对值
dec = dec*(-1);
}
//用 for 循环完成十进制数字转换为二进制数字
for (int i=0;i<Bin.length-1;i++){
if (dec%2==1){
Bin[7-i]=1;
dec = dec/2;
}
else if (dec%2==0) {
Bin[7-i]=0;
dec = dec/2;
}
}
return Bin;
}
//计算反码函数
public static int[] Fan(int[] Yuan,int dec){
//正数原样输出,负数取反
if (dec < 0){
for (int i=1;i<Yuan.length;i++){
if (Yuan[i]==1){
Yuan[i] = 0;
}
else
Yuan[i] = 1;
}
}
return Yuan;
}
//计算补码函数
public static int[] Bu(int[] Fan,int dec){
//正数原样输出,负数在反码上 +1
if (dec < 0){
//最后一位 +1 (是 +1,不是 +1s)
Fan[7]=Fan[7]+1;
for (int i=7;i>0;i--){
//判断 +1 后是否符合二进制书写规范,如果 +1 后出现 2 ,则当前位 -2 ,前一位 +1
if (Fan[i]==2){
Fan[i]=Fan[i]-2;
Fan[i-1]=Fan[i-1]+1;
}
}
}
return Fan;
}
}

运行效果:
Java

2.Python 实现

Python 是在 Java 之前学的,其实有些遗忘,不过 Java 学习一段时间后,发现 Python 和 Java 有很多相似之处,同样是使用三个函数,Java 转 Python 难度并不大,Java 中的注释部分就不再 Python 中重新标注了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
print("Python 十进制数原码、反码、补码计算器")
decin=128
while decin<-127 or decin>127:
print ("请输入一个十进制数字([-127 , 127]范围内)")
decin = int(input())
def Dec2Bin(dec):
bin = [0,0,0,0,0,0,0,0]
if dec >= 0:
bin[0] = 0
else :
bin[0] = 1
dec = -dec
i = 0
while i < 7:
if (dec%2)==1:
bin[7-i] = 1
#这里需要转换一下数据类型,不然会出错,Java 中不需要转换
dec = int(dec/2)
else:
bin[7-i] = 0
dec = int(dec/2)
i=i+1
return bin
print(decin,"二进制原码为",end='')
for x in Dec2Bin(dec=decin):
print(x,end='')
def Fan(Yuan,dec):
if dec >= 0:
return Yuan
else :
i=1
while i<8:
if Yuan[i]==1:
Yuan[i] = 0
else:
Yuan[i] = 1
i=i+1
return Yuan
print()
print("二进制反码为",end='')
FanM = Fan(Yuan=Dec2Bin(dec=decin),dec = decin)
for x in FanM:
print(x,end='')
def Bu(Fan,dec):
if dec<0:
Fan[7]=Fan[7]+1
i = 7
while i>0:
if Fan[i]==2:
Fan[i]=Fan[i]-2
Fan[i-1]=Fan[i-1]+1
i=i-1
return Fan
print()
print("二进制补码为",end='')
BuM = Bu(Fan=FanM,dec=decin)
for x in BuM:
print(x,end='')

小结

高中同学刚开学就问我反码的事儿,我当时也是一脸懵逼,现在也算是入了点门。周六寻思着没事儿写了这个计算器,拿 Python 版本的编译了个 exe 给了高中同学,也算是做了一点微小工作(怎么突然就膜起来了呢?)。

前几天整理 《River Flows In You 全版本收集歌单》,想不到…想不到…想不到…一个歌曲作者竟然私信联系我发红包,吼开森。

圣诞节到了,送你一个苹果吧,希望不要拒收,反正你也不看我博客,你也不知道是谁送的。