Java实现
package com.zhangdapeng520.z01_hello;
/**
* @文件 Z01Hello.java
* @作者 张大鹏
* @版本 v0.1.0
* @描述
* @创建时间 2022-10-17 08:09:00
* @更新时间 2022-10-17 08:09:00
*/
public class Z01Hello {
public static void print(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) {
int num = 1;
print(num);
print(num << 1);
print(num << 2);
print(num << 8);
}
}
核心代码分析:
public static void print(int num) {
for (int i = 31; i >= 0; i--) {
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
System.out.println();
}
打印最小整数和最大整数的二进制表示
完整代码
package com.zhangdapeng520.z01_hello;
/**
* @文件 Z01Hello.java
* @作者 张大鹏
* @版本 v0.1.0
* @描述
* @创建时间 2022-10-17 08:09:00
* @更新时间 2022-10-17 08:09:00
*/
public class Z02PrintMinInt {
public static void print(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) {
int v = Integer.MIN_VALUE;
System.out.println(v);
// 最高位1:表示负数
// 后面都是0:因为负数要对除符号位以外的所有数取反 + 1
print(v);
print(Integer.MAX_VALUE);
}
}
输出结果:
-2147483648
10000000000000000000000000000000
01111111111111111111111111111111
最小整数和最大整数
在Java中,使用Integer.MAX_VALUE
表示最大整数,使用Integer.MIN_VALUE
表示最小整数。
从上面的代码运行结果来看:
- 最小整数:
10000000000000000000000000000000
。最高位是1,表示这是一个负数,其他位都是0,因为负数要对除了最高位以外的其他位取反然后加一,得到最终结果。 - 最大整数:
01111111111111111111111111111111
。最高位是0,表示这是一个正数。其他位都是1,也就是该空间能够存储的最大值,二进制只有0和1,所有的数加起来,得到最终结果,不需要加一。
这里我们可以得出一个结论:某种类型的最小值是其最大值加负号,再减去1。比如这里的最大整数是2147483647
,最小整数则是-2147483648
。
取反加1
完整代码
package com.zhangdapeng520.z01_hello;
/**
* @文件 Z01Hello.java
* @作者 张大鹏
* @版本 v0.1.0
* @描述
* @创建时间 2022-10-17 08:09:00
* @更新时间 2022-10-17 08:09:00
*/
public class Z03GetRverse {
public static void print(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) {
int a = Integer.MIN_VALUE;
// 负数取反 + 1
int b = ~a + 1;
print(a);
print(b);
System.out.println(a);
System.out.println(b);
a = Integer.MAX_VALUE;
// 正数取反 + 1
b = ~a + 1;
print(a);
print(b);
System.out.println(a);
System.out.println(b);
}
}
输出结果:
10000000000000000000000000000000
10000000000000000000000000000000
-2147483648
-2147483648
01111111111111111111111111111111
10000000000000000000000000000001
2147483647
-2147483647
特性分析
如果一个数是负数,对这个数取反+1,得到的结果还是它自己。如果这个数是正数,对这个数取反+1,得到的结果是它的负数。
比如:对负数取反结果如下
10000000000000000000000000000000
10000000000000000000000000000000
-2147483648
-2147483648
对正数取反结果如下:
01111111111111111111111111111111
10000000000000000000000000000001
2147483647
-2147483647
注意:最大整数取反+1,得到的不是最小整数,而是它本身的负数表示形式。