打印一个int整数的32位表示
1. 概述
嗨,大家好
【Java 面试合集】
又来了,今天给大家分享的主题是打印一个int整数的32位表示
.
2. 32位分析
2.1 为什么是32位呢
不知道看到这篇文章的各位是否都知道,一个int类型的表示方式就是32位呢??? 为什么呢
其实很简单啊,因为一个int的占4
个字节, 而每个字节占8
个比特位,所以就是32位了。
但是我们肉眼看到的都是十进制,比如:4
, 10
等,那么我们如果知道用32位怎么表示呢
public class Test001 {
public static String print(int num) {
String res = "";
for (int i = 31; i >=0 ; i -= 1) {
res += ((num & (1 << i)) == 0) ? "0" : "1";
}
return res;
}
}
2.2 位运算&
的分析
其实大家多多少都使用过位运算,但是&
与运算有什么特点呢,就是满足同一位置上都是1的情况,就是1,反之就是0. 如下代码
// 0000 1101 0011
// 0000 1000 0000
// => 结果
// 0000 1000 000
所以只有满足同时为1的时候,结果才是1.
所以上述代码中 我们需要每一位都去&,才能得到最后的结果。
2.3 左移 << 讲解
其实我们都知道计算机底层都是按2进制运算的。所以左移其实就是将1向左移动n位(二进制值不变,但是位置一直左移),如下代码
// 1 << 0 00000000000000000000000000000001
// 1 << 1 00000000000000000000000000000010
// 1 << 2 00000000000000000000000000000100
// 1 << 31 10000000000000000000000000000000
我们可以发现,其实每次都将1左移动到对应的位置。
那么 8 << 3
这种怎么表示呢
其实可以理解为 (1 << 3) * 8
. 所以结果就是64. 下列以此类推:
22 << 4
=>(1 << 4) * 22
25 << 6
=>(1 << 6) * 25
3. 特殊值的分析
System.out.println(print(Integer.MAX_VALUE)); // 01111111111111111111111111111111
System.out.println(print(Integer.MIN_VALUE)); // 10000000000000000000000000000000
虽然说int类型可以用32位来表示,但是其实真正可以使用的只有31位,因为第一个是符号位。如果第一位是0
的话表示正数,反之如果是1
的话,表示负数。
4. 反码以及补码
其实补码就是负数的表示形式。那反码以及补码如何表示呢
反码:就是二进制上每个位置的值都取反,就是反码
补码:就是反码的结果 + 1