1.十进制整数转二进制
思路: 整数除以2,每次将余数保存起来,商循环除以2,直到商为0为止,然后将所有余数逆序打印出来。
例子:
23/2 商: 11 余数: 1
11/2 商: 5 余数: 1
5/2 商: 2 余数: 1
2/2 商: 1 余数: 0
1/2 商: 0 余数: 1
//十进制整数转二进制,每次取商除以2直至商为0,余数追加,最后倒序一下
public static StringBuilder intToBinary(int n){
StringBuilder builder = new StringBuilder();
//商
int quotient = n;
//余数
int remainder =0;
while(quotient!=0){
quotient = n/2;
remainder = n%2;
builder.append(remainder);
n = n/2;
}
return builder.reverse();
}
2.十进制小数转二进制
思路: 小数乘以2,每次乘完取整(1或者0)放到数组中,然后将剩余小数部分继续乘以2,直到小数部分为0或者达到所要求的精度为止,再讲所有余数按顺序打印出来。
例子:
0.813*2 整数部分: 1 小数部分: 0.626
0.626*2 整数部分: 1 小数部分: 0.252
0.252*2 整数部分: 0 小数部分: 0.504
0.504*2 整数部分: 1 小数部分: 0.008
0.008*2 整数部分: 0 小数部分: 0.016
11010是精度为5的小数点后五位,输出为0.11010
注:小数的十进制转化为二进制的误差不大于2^-4是指小数点后4位
代码实现:
//十进制小数转成二进制,d是十进制的小数,decimal是精度
public static StringBuilder doubleToBinary(Double d,int decimal) throws Exception{
if(decimal<=0 || decimal>32){
throw new Exception("精度不合法");
}
StringBuilder str = new StringBuilder();
double rem = 0;
while(decimal>0){
rem = d*2;
if(rem>=1){
str.append(1);
d = rem -1;
}else{
str.append(0);
d = rem;
}
decimal--;
}
return str;
}
3.十进制的整数加小数转二进制
思路: 整数和小数分别转换,然后将两个数组以小数点为分割分别打印出来。
例子:
代码实现:
public static StringBuilder allToBinary(double d) throws Exception{
int in = (int)d;//整数部分
double res = d - in;//小数部分
StringBuilder str = new StringBuilder();
str.append(intToBinary(in));
str.append(".");
str.append(doubleToBinary(res,4));
return str;
}
调用和运行结果: