开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情
题目
给出一个任意整数num,要求打印出一个整数的32位。
比如,num=3,则打印出00000000000000000000000000000011。
思路分析
把给出的整数num转换成二进制形式,一共32位,前面不够的则用0来补充。
我们知道一个int型的整数,他在计算机的底层一定是由32位数字0、1组成的。
在java中,整数都有有符号的整数。
比如,1638这个整数,在计算机中存储表示如下:
那如何知道一个整数在每一位存储的是0还是1呢?
我们知道1这个整数的32位信息一定是最右边为1,其他位全部为0,如下图所示。
与运算
两个位都为1时,结果才为1。
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
1 & 0 = 0
0 & 0 = 0
根据与运算的运算特性,只要每一位都与1进行按位与,如果结果为0则原数字的对应位的数字为0,如果结果为1则原数字对应位的数字为1。
左移
左移运算就是把数据的的二进制向左移动,用符号 << 表示。
比如,1的二进制数表示为
1 左移 1位(1 << 1)表示为
同样也可以看出,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位信息就实现了。