package practice;
import java.util.ArrayList;
public class Lianxi1_5 {
private ArrayList<Integer> al = new ArrayList<>();
private Integer in;
private int xx;
//获取2进制的位数
public void getBinary(int x){
in = x/2;
if(in==0){
al.add(x%2);
}else{
al.add(1);
getBinary(in);
}
//Java默认的是以e为底,转换成以2为底的x,计算出与2的n次方最接近的数,确定要转换为2进制的位数
// double d = Math.log(x)/Math.log(2);
}
public void compare(ArrayList<Integer> alist){
int result = 0;
// System.out.println(xx);
for(int i=0; i<alist.size(); i++){
result+= Math.pow(2, alist.size()-i-1);
if(result< xx){
result += Math.pow(2, alist.indexOf(alist.get(i))-1-i);
System.out.println("这里是1 2^"+ (alist.indexOf(alist.get(i))-1-i));
}else if(result == xx){
for(int j= i+1; j<alist.size(); j++){
//满足条件后面的全部置零
al.set(j, 0);
}
System.out.println("满足条件:" + i);
break;
}else{
result -= Math.pow(2,(alist.size() -i -1));
System.out.println("这里是0");
alist.set(i, 0);
}
}
System.out.println("转为二进制" +BinaryToString(alist));
}
private String BinaryToString(ArrayList<Integer> alist){
String result ="";
for(Integer it : alist){
result += it+"";
}
return result;
}
public int twoToTen(ArrayList<Integer> alist){
int ten=0;
for(int i=0; i<alist.size(); i++){
ten += alist.get(i) * Math.pow(2, alist.size() -i -1);
}
return ten;
}
public static void main(String[] args) {
Lianxi1_5 lx = new Lianxi1_5();
lx.xx = 8000;
lx.getBinary(lx.xx);
System.out.println("长度:"+lx.al);
lx.compare(lx.al);
System.out.println("转换为十进制:" + lx.twoToTen(lx.al));
}
}
长度:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
这里是1 2^-1
这里是1 2^-2
这里是1 2^-3
这里是1 2^-4
这里是1 2^-5
这里是0
满足条件:6
转为二进制1111101000000
转换为十进制:8000
这里又有一个问题,为什么Math.pow()中的第2个参数是负数得出的结果还是正确的??