문자열 2진수 부동 소수점 수와 int 및 NBCD 코드 변환에 대한 질문
55653 단어 컴퓨터 구성과 구조
문자열 바이너리 점 부동 소수점 및 int 및 NBCD 코드 변환에 대한 질문(코드)
public String intToBinary(String numStr) {
int num = Integer.parseInt(numStr);
if (num == 0) return "00000000000000000000000000000000"; //0
boolean isNeg = false;
if (num < 0) { //
num = -num;
isNeg = true;
}
StringBuilder temp = new StringBuilder();
while (num > 0) { //
if (num % 2 == 1) temp.append("1");
else temp.append("0");
num /= 2; }
String ans = temp.reverse().toString(); // ,
int len = ans.length();
for (int i = 0; i < 32 - len; i++) ans = "0" + ans;
if (isNeg) { //
ans = oneAdder(negation(ans)).substring(1);
}
return ans;
}
진위 판단 (첫 번째 판단 넘침 여부)
private String oneAdder(String operand) {
int len = operand.length();
StringBuffer temp = new StringBuffer(operand);
temp = temp.reverse();// ,
int[] num = new int[len];
for (int i = 0; i < len; i++) num[i] = temp.charAt(i) - '0'; // int
int bit = 0x0;
int carry = 0x1;
char[] res = new char[len];
for (int i = 0; i < len; i++) {
bit = num[i] ^ carry;
carry = num[i] & carry;
res[i] = (char) ('0' + bit); // char
}
String result = new StringBuffer(new String(res)).reverse().toString();
return "" + (result.charAt(0) == operand.charAt(0) ? '0' : '1') +result; // ,
}
마이너스 2진법을 반대로 하다
private String negation(String operand) {
StringBuffer result = new StringBuffer();
for (int i = 0; i < operand.length(); i++) {
result = operand.charAt(i) == '1' ? result.append("0") :
result.append("1");
}
return result.toString();
}
public String binaryToInt(String binStr) {
return String.valueOf(valueOf(binStr, 2));
}
public String floatToBinary(String floatStr) {
int eLength = 8;//
int sLength = 23;//
double d = Double.valueOf(floatStr);
boolean isNeg = d < 0;
if (Double.isNaN(d)) {
return "Nan"; }
if(!isFinite(d, eLength, sLength)){
return isNeg ? "-Inf" : "+Inf"; }
StringBuilder answer = new StringBuilder(1+eLength+sLength);
if(isNeg) answer.append("1");
else answer.append("0");
if(d == 0.0) {
for(int i=0;i<eLength+sLength;i++){
answer.append("0"); }
return answer.toString(); }
else {
d = Math.abs(d);
int bias = (int)((maxValue(eLength)+1)/2-1); // bias
boolean subnormal = (d < minNormal(eLength,sLength));
if(subnormal){
for(int i=0;i<eLength;i++){
answer.append("0"); }
d = d * Math.pow(2, bias-1); //
answer.append(fixPoint(d, sLength)); }
else{
int exponent = (int)getExponent(d);
answer.append(integerRepresentation(String.valueOf((int(exponent+bias)),eLength)); // bias d = d / Math.pow(2, exponent);
answer.append(fixPoint(d-1, sLength)); // fixPoint 1, }
} return answer.toString();
}
32비트 완성
private String integerRepresentation(String number, int length) {
String result = intToBinary(number);
return result.substring(32 - length); }
부동점수를 이진법으로 표시할 수 있는지 판단(IEEE754 표준에 표시된 범위)
private boolean isFinite(double d, int eLength, int sLength) {
int bias = (int) ((maxValue(eLength) + 1) / 2 - 1); // bias
int exponent = (int) (maxValue(eLength) - 1 - bias - sLength); // 1 0 , , -1, significand
double significand = maxValue(sLength + 1); //
double result = significand * Math.pow(2, exponent);
return d >= -result && d <= result; }
표시할 수 있는 최대 부동점수를 계산하다
private double maxValue(int length) {
//
return Math.pow(2, length) - 1; }
표시할 수 있는 최소 부동점수를 계산하다
private double minNormal(int eLength, int sLength) {
int bias = (int) ((maxValue(eLength) + 1) / 2 - 1); // bias return Math.pow(2, 1 - bias); // 1, 0 }
움직이지 않다
private String fixPoint(double d, int sLength) {
d = d < 1 ? d : d - (int) d; // d = 0.xxxxx
StringBuilder res = new StringBuilder();
int count = 0;
while (d != 0 && count < sLength) {
d *= 2;
if (d < 1) {
res.append("0"); }
else {
d -= 1;
res.append("1"); }
count++; // sLength }
int len = res.length(); // res.length()
for (int i = 0; i < sLength - len; i++) res.append(0);
return res.toString(); }
public String binaryToFloat(String binStr) {
boolean isNeg = (binStr.charAt(0) == '1');
String exp = binStr.substring(1, 9);
String frag = binStr.substring(9);
if (exp.equals("11111111")) {
if (frag.contains("1")) {
return "NaN"; }
else {
return isNeg ? "-Inf" : "+Inf"; } }
else if (exp.equals("00000000")) {
if (frag.contains("1")) {
double f = 0.0;
int fe = 1;
for (char fc:frag.toCharArray()) {
f += Integer.parseInt(String.valueOf(fc)) / Math.pow(2, fe);
fe++; }
f = (f)*Math.pow(2, -126);
f = isNeg ? -f : f;
return String.valueOf(f); }
else { return "0.0"; } }
double f = 0.0;
int fe = 1;
for (char fc:frag.toCharArray()) {
f += Integer.parseInt(String.valueOf(fc)) / Math.pow(2, fe);
fe++; }
int e = valueOf(exp, 2) - 127;
f = (1+f)*Math.pow(2, e);
f = isNeg ? -f : f;
return String.valueOf(f); }
public String decimalToNBCD(String decimal) {
return getBCDString(Integer.parseInt(decimal)); }
public String getBCDString(int val) {
String sign = val < 0 ? "1101" : "1100"; //
String result = "";
val = Math.abs(val);
int i = 7;
while (i > 0) {
int tmpVal = val % 10;
result = getBCDString_4(tmpVal).concat(result);
val = val / 10;
i--; }
return sign.concat(result); }
public String NBCDToDecimal(String NBCDStr) {
return String.valueOf(NBCDTrueValue(NBCDStr)); }
private int NBCDTrueValue(String operand) {
StringBuilder ans = new StringBuilder();
if (operand.startsWith("1101")) ans.append('-');
operand = operand.substring(4);
for (int i = 0; i < operand.length() && i < 28; i += 4) {
ans.append(Integer.valueOf(operand.substring(i, i + 4), 2)); }
return Integer.parseInt(ans.toString()); }