题目:给定一个整数,输出该整数对应的32位二进制
话不多说我们直接上代码
package com.lbmb.chapter01_bitOperation;
/**
* @author 林文塨
* @date 2022-07-02 19:02
* description 给定一个整数,输出该整数对应的32位二进制
*/
public class Code01 {
public static void printBinary(int num) {
for (int i = 31; i >= 0; i--) {
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
}
public static void main(String[] args) {
int num = 7;
printBinary(num);
}
}
原理:
总所周知,在计算机的世界中只有0和1,任何位运算都是针对于二进制进行计算的。
首先我们来了解位运算中的与运算符(&)
"&"运算规则:
只有1&1为1,其它都为0
0&0=0; 0&1=0; 1&0=0; 1&1=1;
然后我们再来了解一下左移运算符(<<)和右移运算符(>>),这里说的移位运算都指的是有符号数算术移位,有关算数位移、逻辑移位和无符号数移位的内容不是本文的主要关注内容,请自行百度。
"<<"运算规则:
整体左移,右侧补0
左移前
00000000000000000000000000000001
左移后
00000000000000000000000000000010
">>"运算规则:
整体右移,符号位要一起移动,并且在左侧补上符号位
右移前
10000000000000000000000000000001
右移后
11000000000000000000000000000000
接下来就是重点了
我们随便取一个数:
int number = 3461343
他在计算机底层的32位二进制表示是:(int一般是4个字节,一个字节8bit)
00000000001101001101000011011111
我们用一个32次的循环,让1分别左移31次到0次会得到什么呢
for (int i = 31; i >= 0; i--) {
1 << i:
}
我们会得到只有一位有1,其余全是0的32位二进制(其实这32个结果就代表着每个位上的状态)
10000000000000000000000000000000
01000000000000000000000000000000
00100000000000000000000000000000
…
00000000000000000000000000000100
00000000000000000000000000000010
00000000000000000000000000000001
那么我们再将这32个结果分别与上面3461343的二进制相与 &
00000000001101001101000011011111
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
10000000000000000000000000000000
01000000000000000000000000000000
00100000000000000000000000000000
...
00000000000000000000000000000100
00000000000000000000000000000010
00000000000000000000000000000001
因为0和任意其他相与都为0,对于10000000000000000000000000000000就能用后面31位的0把00000000001101001101000011011111后面的31位全抹成0,而最左边的1就能把目标数的最左边上的数提取出来。我们用32个不同位置的1提取32次,就能把目标数32位的信息全提取出来。
最后我们只要判断提取出来的数为0还是1,并进行打印即可
for (int i = 31; i >= 0; i--) {
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
完整代码笔记
package com.lbmb.chapter01_bitOperation;
/**
* @author 林文塨
* @date 2022-07-02 19:02
* description 给定一个整数,输出该整数对应的32位二进制
*/
public class Code01 {
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) {
int num = 3461343;
printBinary(num);
System.out.println("补充:下面是一些重要的二进制数");
/*
* 1.最大有符号整型的绝对值比最小整型的绝对值小
* 2.范围是-2^31 ~ 2^31-1
* 3.负数用了补码表述
* */
System.out.println("最大整型(十进制):" + Integer.MAX_VALUE);
System.out.println("最小整型(十进制):" + Integer.MIN_VALUE);
System.out.print("最大整型(二进制):");
printBinary(Integer.MAX_VALUE);
System.out.print("最小整型(二进制):");
printBinary(Integer.MIN_VALUE);
/*
* 相反数可以用补码来计算,即取反加以
* */
int a = 5;
int b = ~a + 1;
System.out.println("用补码来计算相反数:" + a + " ================= " + b);
/*
* 对于有符号整型,正数都有唯一的负数作为相反数对应,但是负数有个例外,就是最小负数-2147483648
* -2147483648的相反数是本身
* */
int x = Integer.MIN_VALUE;
int y = ~x + 1;
System.out.println("最小负数的相反数是本身:" + x + " ================= " + y);
}
}
输出结果
00000000001101001101000011011111
补充:下面是一些重要的二进制数
最大整型(十进制):2147483647
最小整型(十进制):-2147483648
最大整型(二进制):01111111111111111111111111111111
最小整型(二进制):10000000000000000000000000000000
用补码来计算相反数:5 ================= -5
最小负数的相反数是本身:-2147483648 ================= -2147483648