算法|打印一个整数的二进制

243 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情

题目

给出一个任意整数num,要求打印出一个整数的32位。

比如,num=3,则打印出00000000000000000000000000000011。

思路分析

把给出的整数num转换成二进制形式,一共32位,前面不够的则用0来补充。

我们知道一个int型的整数,他在计算机的底层一定是由32位数字0、1组成的。

在java中,整数都有有符号的整数。

比如,1638这个整数,在计算机中存储表示如下:

image.png

那如何知道一个整数在每一位存储的是0还是1呢?

我们知道1这个整数的32位信息一定是最右边为1,其他位全部为0,如下图所示。

image.png

与运算

两个位都为1时,结果才为1。

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
1 & 0 = 0
0 & 0 = 0

根据与运算的运算特性,只要每一位都与1进行按位与,如果结果为0则原数字的对应位的数字为0,如果结果为1则原数字对应位的数字为1。

左移

左移运算就是把数据的的二进制向左移动,用符号 << 表示。

比如,1的二进制数表示为

image.png

1 左移 1位(1 << 1)表示为

image.png

同样也可以看出,1 << 1 相当于 1 * 2

所以,按照位移运算、与运算,我们只需要将给定的num每一位与1进行相与运算即可。

代码实现

public class Code01_PrintBinary {

    public static void printBinary(int num) {

        for (int i = 31; i >= 0; i--) {
            System.out.print((num & (1 << i)) == 0 ? "0" : "1");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        printBinary(1638);
        printBinary(1120);
    }
}

运算结果:

00000000000000000000011001100110
00000000000000000000010001100000

代码含义

i从31开始,也就是先计算第32位。

1 << i,当 i 为31时,1左移31位(1<<31),把1放到最左边,右边全是0,这样最高位与1进行相与,其他位全部是0,就把num的第32的位置计算出来了。

i 为30时,1左移30位,把1放到第30位(1<<30),前面是0,右边也全是0,只有第31这个位置为1,其他位全部是0,这样就把num的第31的位置计算出来了。

以此类推,1向左移动i位,就可以计算出num的第i位的二进制数,就这样就可以把num的每一位都进行计算出来。

这样,打印一个数的32位信息就实现了。