方法一: 主要通过辗转相除法实现,既 不断除二求余数的过程,但是需要注意正负数。
public class Number2Binary {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (true){
System.out.print("input a number:");
int number = input.nextInt();
int number2;
// 如果是负数,需要加上2^31次方
if (number < 0) {
number2 = (int)(Math.pow(2,31) + number);
}else{
number2 = number;
}
String binary = "";
// 通过辗转相除法,求出二进制数,保存在binary中
int shang = number2;
int yu ;
int count = 0;
while(shang != 0) {
yu = shang % 2;
shang /= 2;
count++;
if (count % 4 == 0) {
binary = "_" + yu + binary;
} else {
binary = yu + binary;
}
}
// 不够32位,需要补齐
while(count < 31){
count++;
if(count % 4 == 0 ){
binary = "_" + 0 + binary;
}else {
binary = 0 + binary;
}
}
//判断符号位
if(number < 0 ){
binary = 1 + binary;
}else {
binary = 0 + binary;
}
System.out.println(binary);
}
}
}
测试案例
方法二:通过位移的方式
从最高位的数移至最低位(移31位),除过最低位其余位置清零。
使用1与移位后的数字相&,是为了拿到最低位的数字。
使用& 操作,可以使用和1相与(&),由于1在内存中除过最低位是1,其余31位都是零,然后把这个数按十进制输出;再移次高位,做相同的操作,直到最后一位 。
public static void binaryToTwo(int n) {
for (int i = 31; i >= 0; i--)
System.out.print(n >>> i & 1);
}
-2的二进制 :1111_1111_1111_1111_1111_1111_1111_1110
-2 >>> 31 : 1111_1111_1111_1111_1111_1111_1111_1110
-2 >>> 31 & 1 = 1
-2 >>> 30 & 1 = 1
-2 >>> 0 & 1 = 0
说明:在计算机中负数是按照补码输出,既 负数的补码 = 源码取反(符号位不变) + 1;
位运算的知识点补充: 知识点补充