- 引入BigInteger包,通过它和Integer类的API方法进行二进制和十进制的互相转换
import java.math.BigInteger;
public class Lesson1_1{
/**
* @Description:十进制转换成二进制
* @param decimalSource
* @return String
*/
public static String demicalToBinary(int decimalSource) {
BigInteger bi = new BigInteger(String.valueOf(decimalSource)); //转换成BigInteger
return bi.toString(2); //参数2指定的是转化成二进制
}
/**
* @Description:二进制转换成十进制
* @param binarySource
* @return int
*/
public static int binaryToDecimal(String binarySource) {
BigInteger bi = new BigInteger(binarySource, 2); //转换为BigInteger类型,参数2指定二进制
return Integer.parseInt(bi.toString()); //默认转换成十进制
}
}
计算机为什么使用二进制
- 计算机使用二进制和现代计算机系统的硬件实现有关。
- 组成计算机系统的逻辑电路通常只有两个状态,即开关的接通与断开。
- 断开的状态用“0”来表示,接通的状态用“1”来表示。
- 由于每位数据只有两种状态,即便系统受到一定程度干扰,它仍然能够可靠地分辨出数字是“0”还是“1”。
- 因此,在具体的系统实现中,二进制的数据表达具有抗干扰能力强、可靠性高的优点。
- 如果用十进制设计具有10种状态的电路,情况就会非常复杂,判断状态的时候出错的几率会大大提高。
- 另外,二进制非常适合逻辑运算。
- 逻辑运算中的“true”,“false”,正好与二进制的“1”,“0”相对应。
- 逻辑运算中的加法(或运算)、乘法(与运算)以及否定(非运算)都可以通过“0”和“1”的加法乘法和减法来实现。
二进制的移位操作
import java.math.BigInteger;
public class Lesson1_2{
/**
* @Description:向左移位
* @param num- 等待移位的十进制数,m- 向左移的位数
* @return int- 移位后的十进制数
*/
public static int leftShift(int num, int m) {
return num << m;
}
/**
* @Description:向右移位
* @param num- 等待移位的十进制数,m- 向右移的位数
* @return int- 移位后的十进制数
*/
public static int rightShift(int num, int m) {
return num >>> m;
}
}
- Java中的左移和右移的表示不太一样。
左移位是<<,那右移位为什么是>>>而不是>>呢
其实>>也是右移操作
根本原因是Java的二进制数值中最高一位是符号位
Java里定义了两种右移:逻辑右移和算术右移
逻辑右移1位,左边补0即可;算术右移保持符号位不变,除符号位以外的右移一位并补符号位1,补的1仍然在符号位之后
- 逻辑右移在Java和Python中使用>>>表示,算术右移使用>>表示。
- 在C或C++中,逻辑右移和算术右移共享同一个运算符>>。编译器由运算数的类型来决定使用逻辑或者算术右移。
- 如果运算数类型是unsigned,采用逻辑右移;signed,采用算术右移。
- 如果针对unsigned类型的数据使用算术右移,或者针对signed类型的数据使用逻辑右移,需要先进行类型转换。
- 由于左移位无需考虑高位补1还是补0,所以不需要区分逻辑左移和算术左移。
- Java中使用|表示安慰的或,&表示按位与,^表示按位异或
import java.math.BigInteger;
public class Lesson1_3{
/**
* @Description:二进制按位或的操作
* @param num1- 第一个数字,num2- 第二个数字
* @return 二进制按位或的结果
*/
public static int or(int num1, int num2) {
return (num1 | num2);
}
/**
* @Description:二进制按位与的操作
* @param num1- 第一个数字,num2- 第二个数字
* @return 二进制按位与的结果
*/
public static int and(int num1, int num2) {
return (num1 & num2);
}
/**
* @Description:二进制按位异或的操作
* @param num1- 第一个数字,num2- 第二个数字
* @return 二进制按位异或的结果
*/
public static int xor(int num1, int num2) {
return (num1 ^ num2);
}
}
二进制贯穿在很多常用的概念和思想中,例如逻辑判断、二分法、二叉树等等。
逻辑判断中的真假值就是用二进制的1和0来表示的。
二分法和二叉树都是把要处理的问题一分为二,正好也可以通过二进制的1和0来表示。
移位操作:二进制左移一位,就是将数字翻倍。二进制右移一位,就是将数字除以2并求整数商。
逻辑操作:或:参与操作的位中只要有一个是1,最终结果就是1.
与:参与操作的位中必须全都是1,最终结果才是1,否则就为0.
异或:参与操作的位相同,最终结果就为0,否则为1.