[java入门到精通] 05 进制与二维数组

进制与二维数组

学习目标:

  • 了解进制
    • 了解进制划分
    • 了解进制的转换
    • 了解原码反码补码
    • 了解位运算
  • 了解二维数组定义使用
    • 二维数组的定义和初始化
    • 二维数组的遍历
    • 了解二维数组常见操作
      • 求和
      • 求最值

1.进制

1.1进制的概述和分类

进制:指进位制,是人们规定的一种进位方式
表示某一位置上的数,运算时是逢X进一位。
十进制是逢十进一,二进制就是逢二进一,八进制是逢八进一

常见进制:二进制,八进制,十进制,十六进制

1.2为什么要学习进制?

原因:计算机数据在底层运算的时候,都是以二进制形式
也有数据是以八进制、十进制、或者十六进制进行存储或运算,了解不同的进制,便于我们对数据的运算过程理解的更加深刻。

1.3进制的运算规则
十进制:
  	运算规则:逢十进一,借一当十。
二进制:
  	介绍:二进制数据是用01两个数码来表示。例如:0101000
	进位规则是“逢二进一”,借位规则是“借一当二”。
八进制:
  	八进制介绍:采用01234567八个数字,逢八进1
十六进制:
  	十六进制介绍:用数字09和字母AF(或a~f)表示,其中:A~F表示10~15,这些称作十六进制。
	【0】【1】【2】【3】【4】【5】【6】【7】【8】【9】【a】【b】【c】【d】【e】【f】


1.4不同进制的书写格式
十进制:Java中,数值默认都是10进制,不需要加任何修饰。
二进制:数值前面以0b开头,b大小写都可以。
八进制:数值前面以0开头。
十六进制:数值前面以0x开头,x大小写都可以。
  
注意:以上内容是jdk7版本之后才被支持。

public class Demo01 {
    public static void main(String[] args) {
        System.out.println(1010);
        System.out.println(0B1010);
        System.out.println(01010);
        System.out.println(0X1010);

    }
}
1.5进制转换

总结:
1.任意进制到十进制的转换
公式:系数 * 基数的权次幂 相加
系数:每一【位】上的数
基数:几进制,就是几
权:从数值的右侧,以0开始,逐个+1增加
2.十进制到任意进制的转换
公式:除基取余
使用源数据,不断的除以基数(几进制,基数就是几)得到余数,直到商为0,再将余数倒着拼起来即可。

1.6快速进制转换法
2.6.1 8421码:
8421码又称BCD码,是BCD代码中最常用的一种
BCD: (Binary-Coded Decimal‎) 二进制码十进制数
在这种编码方式中,每一位二进制值的1都是代表一个固定数值,把每一位的1代表的十进制数加起来得到的结果就是它所代表的十进制数。
2.6.2 二进制快速转八进制
八进制:将三个二进制位看为一组,再进行转换
原因:八进制逢八进一,三个二进制位最多可以表示111,也就是数值7,如果出现第四位,就超范围了
2.6.3 二进制快速转十六进制
十六进制:将四个二进制位看为一组,再进行转换
原因:十六进制逢十六进一,四个二进制位最多可以表示1111,也就是数值15,如果出现第五位,就超范围了

2.原码反码补码

2.1 原码反码补码概述
原码(可直观看出数据大小)
    就是二进制定点表示法,即最高位为符号位,【0】表示正,【1】表示负,其余位表示数值的大小。
    通过一个字节表示+7和-7,代码:byte b1 = 7;   byte b2 = -7;
    一个字节等于8个比特位,也就是8个二进制位
        0(符号位)	0000111
        1(符号位)	0000111
反码
	正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码(数据以该状态进行运算)
	正数的补码与其原码相同;负数的补码是在其反码的末位加1。
      
注意:计算机中的数据,都是以二进制补码的形式在运算,而补码则是通过反码和原码推算出来的。
2.2 位运算符
2.2.1 位运算符介绍

位运算符指的是二进制位的运算,先将十进制数转成二进制后再进行运算。
在二进制位运算中,1表示true,0表示false。

符号计算方式
&遇到0(false)则0(false),两边同时为1(true),结果才是1(true)
|遇到1(true)则1(true),两边都是0(false),结果才是0(false)
^相同为false,不同为true
~取反,二进制位全部取反,0变1,1变0,包括符号位
<<有符号左移运算,左边符号位丢弃,右边补齐0
>>有符号右移运算,根据符号位,补齐左边
>>>无符号右移,无论最符号位是0还是1,都补0
public class Demo02 {
    public static void main(String[] args) {
        System.out.println(6&2);
        System.out.println(7&2);

        System.out.println(6|2);

        System.out.println(6^2);
        System.out.println(~6);
        /*
            有符号左移:正整数左移几位,就是乘以2的几次幂
         */
        System.out.println(3<<1); //6
        System.out.println(3<<2); //12
        System.out.println(3<<3); //24
        System.out.println(3<<4); //48
        /*
            有符号左移:负整数左移几位,就是成2的几次幂
         */
        System.out.println(-3<<1);
        System.out.println(-3<<2);
        System.out.println(-3<<2);
        System.out.println(-3<<4);
        /*
            有符号左移:正整数右移几位,就是除以2的几次幂
         */
        System.out.println(48>>1);
        System.out.println(48>>2);
        System.out.println(48>>3);
        System.out.println(48>>4);
         /*
            有符号左移:负整数右移几位,就是除以2的几次幂
         */
        System.out.println(-48>>1);
        System.out.println(-48>>2);
        System.out.println(-48>>3);
        System.out.println(-48>>4);
        /*
         无符号右移
         */
        System.out.println(48>>>1);
        System.out.println(-48>>>1);

        //1变成8效率最高使用左移
        System.out.println(1<<3);
    }
2.2.2 异或运算的特点 一个数,被另外一个数,异或两次,该数本身不变。
/*
    异或运算的特点:
        一个数字被另外一个数字异或两次还是数字本身
 */
public class Demo03 {
    public static void main(String[] args) {
        System.out.println(6^5^5);
        System.out.println(5^6^5);
        System.out.println(5^5^6);

        //
    }
}
2.2.3数据交换练习
/*
需求:已知两个整数变量a = 10,b = 20,使用程序实现这两个变量的数据交换
最终输出a = 20,b = 10;
 */
public class Demo04 {
    public static void main(String[] args) {
//        method1();
        //不使用第三方变量
        int a = 10;
        int b = 20;
        a = a ^ b; // a = 10^20
        b = a ^ b; // b = 10^20^20 = 10
        a = a ^ b; // a = 10^20^10 = 20
        System.out.println(a);
        System.out.println(b);


    }

    private static void method1() {
        int a = 10;
        int b = 20;
        int temp = a;
        a = b;
        b = temp;
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
}

2.2.3 数组反转
import java.util.Arrays;

/*
需求:已知一个数组 arr = {19, 28, 37, 46, 50}; 用程序实现把数组中的元素值交换,
          交换后的数组 arr = {50, 46, 37, 28, 19}; 并在控制台输出交换后的数组元素。

 */
public class Demo05 {
    public static void main(String[] args) {
        int[] arr = {19, 28, 37, 46, 50};
//        reverseArray(arr);
        for (int start = 0, end = arr.length - 1; start < end; start++, end--) {
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
        }
        //打印反转后的数组:
        System.out.println(Arrays.toString(arr));


    }

    private static void reverseArray(int[] arr) {
        //定义开始索引
        int start = 0;
        //定义结束索引
        int end = arr.length - 1;

        //判断开始的索引小于结束的索引 交换位置
        while (start < end) {
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
            //
            start++;
            end--;
        }
        //打印反转后的数组:
        System.out.println(Arrays.toString(arr));
    }
}

3.二维数组

3.1二维数组概述

二维数组也是一种容器,不同于一维数组,该容器存储的都是一维数组容器

3.2 二维数组格式
格式1:数据类型 [ ] [ ] 变量名;
范例:int [ ] [ ] arr;
格式2:数据类型 变量名[ ] [ ];
范例:int arr[ ] [ ];
格式3:数据类型[ ] 变量名[ ];
范例:int[ ] arr[ ];
3.3二维数组动态初始化

格式:数据类型 [ ] [ ] 变量名 = new 数据类型[ m ] [ n ];
m表示这个二维数组,可以存放多少个一维数组
n表示每一个一维数组,可以存放多少个元素
范例:int [ ] [ ] arr = new int [ 2 ][ 3 ];
该数组可以存放2个一维数组,每个一维数组中可以存放3个int类型元素

3.4二维数组遍历
public class Demo01 {
    public static void main(String[] args) {
        int [] [] arr = new int[4][3];
        /*System.out.println(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }*/
        /*System.out.println(arr[0][0]);
        System.out.println(arr[0][1]);
        System.out.println(arr[0][2]);

        System.out.println(arr[1][0]);
        System.out.println(arr[1][1]);
        System.out.println(arr[1][2]);

        System.out.println(arr[2][0]);
        System.out.println(arr[2][1]);
        System.out.println(arr[2][2]);

        System.out.println(arr[3][0]);
        System.out.println(arr[3][1]);
        System.out.println(arr[3][2]);*/
        for (int i = 0; i < arr.length; i++) {//外层循环获取每一个以为数组的地址
//            System.out.println(arr[i]);
//            int [] brr = arr[i];
//            System.out.println(brr);
            for (int j = 0; j < arr[i].length; j++) {//获取 每一个以为数组中的元素
                System.out.println(arr[i][j]);
            }
        }
    }
}
3.5二维数组的静态初始化

格式:数据类型 [ ] [ ] 变量名 = new 数据类型[ ] [ ] { {元素1,元素2}, {元素1, 元素2} };
范例:int [ ] [ ] arr = new int [ ][ ] { {11,22} , {33,44} };
简化格式:数据类型 [ ] [ ] 变量名 = { {元素1,元素2}, {元素1, 元素2} };
范例:int [ ] [ ] arr = { {11,22} , {33,44} };

3.6二维数组常见操作
/*
    某公司季度,和月份统计的数据如下:单位(万元)
	第一季度:22,66,44
	第二季度:77,33,88
	第三季度:25,45,65
	第四季度:11,66,99

1.遍历数组,获取每个月销售额度
 */
public class Demo02 {
    public static void main(String[] args) {
        int[][]arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}};
        //1.遍历数组,获取每个月销售额度
        //获取每一个以为数组
        /*for (int i = 0; i < arr.length; i++) {
            //获取每一个一维数组中的元素
            for (int j = 0; j < arr[i].length; j++) {
                System.out.println(arr[i][j]);
            }
        }*/
        //2.求年度销售总和
        //定义变量
        int sum = 0;
        //遍历二维数组获取每一个一维数组
        for (int i = 0; i < arr.length; i++) {
            //获取每一个一维数组中的元素
            for (int j = 0; j < arr[i].length; j++) {
                //累加求和
                sum+=arr[i][j];
            }
        }
        System.out.println("年销售总和:"+sum+"万元");

        //求平均值
        //先求二维数组长度
        int count = 0;//统计二维数组中的元素
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                count++;
            }
        }
        double avg = sum*1.0/count;
        System.out.println(avg);
        //求最大值
        //先定义最大值
        int max = arr[0][0];
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j]>max){
                    max = arr[i][j];
                }
            }
        }
        System.out.println("max = "+max);
        //求二维数组最小值
        //先定义最小值
        int min = arr[0][0];
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j]<min){
                    min = arr[i][j];
                }
            }
        }
        System.out.println("min = "+min);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值