计算机十进制转二进制(非短除法)

短除法

在中学时期,可能就有所接触进制转换,使用的方法是“短除法”。即除法取余,倒序排列。举个例子来说,就是十进制的13(D)转换成二进制,使用短除法应该如何操作?每次除以进制,取得余数,将商当作下一次的被除数,循环直到商为0。

即:

13/2=5……1,

5/2=2……1,

2/2=1……0,

1/2=0……1

将除数倒序排列后,得到 1011(B),即为13(D)的二进制表示。

在刚学习程序设计时,也是会经常遇到进制转换的题目,我们也是使用短除法进行操作,主要逻辑如下:

	public static String baseConversion(int decimal){
        StringBuilder builder=new StringBuilder();
        while (decimal>0){
            int temp=decimal%2;
            decimal=decimal/2;
            builder.insert(0,temp);
        }
        return builder.toString();
    }

位运算和与运算

这次想聊的不是短除法,而是使用与运算和位运算,”得到”二进制。为什么是“得到”,而不是“转换”呢?其实计算机底层存储数字使用的本身就是二进制,我们只需要将他存储的二进制想办法“得到”就可以了,计算机已经完成了“转换”的操作,我们就不需要自己去“转换”了。

那么如何得到呢,先介绍以下位运算,<< >> 分别是左移运算和右移运算,比如右移:1101001>>1=110100,直接去掉最右边的几位即可,其实右移相当于除以2的n次方,左移同理,11<<1=110,向左移动n位,移动多出的位数补0,相当于乘2的n次方。那么,为什么不直接使用乘法和除法呢,因为计算机使用位运算要比乘除运算效率高不少,比如我们在二分查找时,也可能会使用右移运算代替除以2这个操作。当然,这里我们暂时说的是,二进制的正整数,不包括负数和浮点数。

再说一下&运算符,计算规则如下:1&1=1,1&0=0,0&1=0,0&0=0,按位与比如:

           1 0 1
           0 1 1
  得到     0 0 1

操作

那么,计算机既然已经将十进制转换成二进制存储了,那我们只要想办法取出来就可以了。我们可以如下操作,按位与1,得到最低位的值,右移一位,重复上述过程,直到为0。

解释一下,这个过程完整是这样的:比如13(D),在存入计算机时,就已经被计算机转换成二进制1101(B)了,我们发现&1可以探查每一位的值,1&1=1,0&1=0,所以,我们可以用1101&1=1,这个1是我们使用与运算探查出最低位是1而不是0,那么我们可以右移一位,1101>>1=110,继续&1探查,110&1=0,右移110>>1=11,探查11&1=1,右移11>>1=1,探查1&1=1,右移1>>1=0,为0时,结束这个过程。如此我们就知道了计算机存储的二进制每一位是什么样子的了,我们将其拼凑出来,1101,即可出来。

这个过程使用代码如下:

	public static String convert(int decimal){
        StringBuilder builder=new StringBuilder();
        while (decimal>0){
            int temp=decimal&1;
            decimal=decimal>>1;
            builder.insert(0,temp);
        }
        return builder.toString();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值