方法一: 主要通过辗转相除法实现,既 不断除二求余数的过程,但是需要注意正负数。
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;
位运算的知识点补充: 知识点补充