计算机的源头:二进制

  • 引入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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值