java基础讲义02
一 进制
1.1 进制介绍
进制也就是进位计数制,是人为定义的带进位的计数方法。 对于任何一种进制---X进制,就表示每一位置上
的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,
x进制就是逢x进位。
Java中常量的四种表现形式
二进制的数据表现形式
由0,1组成,以0b开头(jdk7版本开始的,b可大写)。
八进制的数据表现形式
由0,1…7组成,以0开头。
十进制数据表现形式
由0,1…9组成,整数默认是十进制的。
十六进制数据表现形式
由0,1…9,a,b,c,d,e,f(大小写均可)。 以0x开头(x可大写)
public static void main(String[] args){
System.out.println(0b10);//二进制 2
System.out.println(010);//八进制 8
System.out.println(10);//十进制 10
System.out.println(0x10);//十六进制 16
}
1.2 二进制
计算机的底层都是二进制(据本人了解,计算机是已补码的形式进行存储数据的)
在计算机中采用二进制数表示各种信息数据,进行运算,主要是因为二进制本身具有一些独特的优点如:
表示简单、运算方便、逻辑简单方便、可靠性高、转换方便。
1 表示方便
二进制只有两个数码0、1,计算机中非常容易表示电子元器件、电子下路、磁芯等物理不见的两种不同的
物理状态表示。如晶体管的导通与截止,电容的充电和放点,开关的接通与断开,电流的有与无,灯的亮与
灭,磁芯磁化极性的不同等两个截然不同的对立状态都可用于表示二进制数。将多个器件排列起来,就可表示
多位二进制数。
如果采用十进制,则需要在硬件上实现十个稳定的物理状态,来表示从 0~9 的 10 个数码,这是非常
困难的。
2 运算简单
二进制的运算法则比较简单,如二进制的加法运算法则只有四条: 0+0=0 0+1=1 1+0=1 1+1=
10(逢二进一),而十进制的加法运算法则有100条。另外,二进制数的乘、除法运算只需要通过加法运算和移
位操作就可以完成,这比十进制数的乘、除法运算要简便得多,据此设计的计算机运算器硬件结构大为简化,
也为计算机软件的设计带来很大方便。
3 逻辑运算
逻辑代数又称布尔代数,是计算机逻辑电路设计的重要理论工具和二值逻辑运算的理论基础。二进制的两
个数码 0 和 1 正好与逻辑代数中的真(True)和假(False)相对应,所以采用二进制,既便于使用逻辑
代数的方法去设计和简化计算机的各种逻辑电路,也可以在计算机中根据二值逻辑进行逻辑运算。
4 可靠性高
二进制数只有 0 和 1 两个基本数码,在存储、传输和处理时不容易出错,可靠性高。
5 转换方便
计算机使用二进制,人们习惯于使用十进制。而二进制与十进制间的转换很方便,二进制与八进制、十六
进制的转换也很简单,因此使人与计算机间的信息交流既简便又容易。
如何用0,1表示数据
两种状态位表示数据只能表示四种类型数据:
用1表示开,0表示关,开开(11),关关(00),开关(10),关开(01)。
四种状态位根本不够表达所有的数据(字母、字符、数字等),国际化组织规定用8个状态位来表示一个数据,
单位:一个字节byte(8bit),字节也是计算机中最小的存储单位。
单位:
8bit的二进制表示:00000000
1byte = 8bit(比特位)1字节
1k = 1024byte 1k
1m = 1024k 1m
1G = 1024m 1G
1T = 1024G 1T
八进制和十六进制
我们看到的所有数据底层都是二进制表示如:图像、视频、文字等,如果未经过转换将看到的是一堆1110101....二
进制数码。
二进制数码随着数据越大状态位会不断增长,表现形式极长不够友好,科学家们基于二进制基础上进行一定规律优化
后得到八进制和十六进制,优化后进制变得越大表现形式会变得越短。
八进制(简单理解:二进制三个为一组计算十进制得到的结果)
将二进制从右往左,3个2进制数码分一组,如果不够用0补齐。计算出每一组2进制数据的10进制结果,再将这几组结
果拼接起来就是8进制。
10010111
010 010 111
----- ----- -----
10进制结果 10进制结果 10进制结果
---------------------------------------
2 2 7
三组10进制结果拼接起来就是8进制
0 227
十六进制(简单理解:二进制四个为一组计算十进制得到的结果)
将二进制从右往左,4个2进制数码分一组,如果不够用0补齐。计算出每一组2进制数据的10进制结果,再将这
几组结果拼接起来就是16进制。
10010111
1001 0111
------- ------
10进制结果 10进制结果
------------------------------------
9 7
两组10进制结果拼接起来就是16进制
0x97
1.3 任意进制到十进制转换
三要素:数位、基数、位权
数位
“数位”是指一个数的每个数字所占的位置。数位顺序表从右端算起,第一位是“个位”,第二位是“十位”,第三
位是“百位”,第四位是“千位”,第五位是“万位”,等等。同一个数字,由于所在的数位不同,它所表示的数值
也就不同。例如,在用阿拉伯数字表示数时,同一个‘6’,放在十位上表示6个十,放在百位上表示6个百,放
在亿位上表示6个亿等等。
基数
基数是指在某种进位计数制中,每个数位上所能使用的数码的个数。
二进制:
二进制两个数码(0,1),基数为2
八进制:
八进制包含8个数码(0,1,2,3,4,5,6,7),基数为8
十进制:
十进制包含10个数码(0~9),基数为10
十六进制:
十六进制包含16个数码(0~9、A~F),基数为16
例:
10进制转换为其他进制,基数为10,2进制转换为其他进制基数为2,其他进制同理。
位权
又称权,数码所在的位置的加权值,可以理解为权重,倍率。
例如:
从右往左,从零开始。二进制第2位的位权为1,第3位的位权为2。
简单的可理解为是对每一个位上的数进行编号,编号是从右往左,从0开始。
二进制:111001
对应权:543210
计算公式
数位的值 * 基数 ^ 权
注:
^表示基数的幂次,幂的次数去却与权的大小。
十进制到十进制的转换
10进制数8848转换为10进制
8848
= 8000 + 800 + 40 + 8
= 8*10^3 + 8*10^2 + 4*10^1 + 8*10^0
= 8000 + 800 + 40 + 8
= 8848
10进制12345转换为10进制
12345
= 10000 + 2000 + 300 + 40 + 5
= 1*10^4 + 2*10^3 + 3*10^2 + 4*10^1 + 5*10^0
= 10000 + 2000 + 300 + 40 + 5
= 12345
二进制到十进制的转换
2进制数0b100转换为10进制
0b100
= 1*2^2 + 0*2^1 + 0*2^0
= 4 + 0 + 0
= 4
八进制到十进制之间的转换
8进制数0100转换为10进制
0100
= 1*8^2 + 0*8^1 + 0*8^0
= 64 + 0 + 0
= 64
十六进制到十进制之间的转换
16进制数值0x100到10进制之间的转换
0x100
= 1*16^2 + 0*16^1 + 0*16^0
= 256 + 0 + 0
= 256
1.4 十进制到任意进制之间的转换
10进制到任意进制之间的转换方式,除以基数取余直到商为0,余数反转。
十进制转为十进制
10进制数8848转换为10进制
8848 除 10 = 884 余 8
884 除 10 = 88 余 4
88 除 10 = 8 余 8
8 除 10 = 0 余 8
-------------------------------
余数反转 = 8848
十进制到二进制之间的转换
10进制数100转换为2进制
100 除 2 = 50 余 0
50 除 2 = 25 余 0
25 除 2 = 12 余 1
12 除 2 = 6 余 0
6 除 2 = 3 余 0
3 除 2 = 1 余 1
1 除 2 = 0 余 1
-------------------------------
余数反转 = 1100100
十进制到八进制之间的转换
10进制数100转换为8进制
100 除 8 = 12 余 4
12 除 8 = 1 余 4
1 除 8 = 0 余 1
-------------------------------
余数反转 = 144
十进制到十六进制之间的转换
10进制数100转换为16进制
100 除 16 = 6 余 4
6 除 16 = 0 余 6
-------------------------------
余数反转 = 64
1.5 快速转换法
8421码又称为BCD码,是十进制代码中最常用的一种。在这种编码方式中,每一位二值代码的“1”都代表一个
固定数值。将每位“1”所代表的二进制数加起来就可以得到它所代表的十进制数字。
快速转换表
二进制和十进制相互快速转换
2进制数0b1010100转换为10进制(按照位数填值相加)
0+0+4+0+16+0+64
= 84
10进制数100转换为2进制(从最高位开始减,有用到的写1,没有用到的写0;直到减为0)
100-64-32-4=0
100 - 64 = 36
36 - 32 = 4
4 - 4 = 0
= 0b1100100
二进制快速转化为八进制(三个为一组算十进制)
二进制快速转换为十六进制(四个为一组算十进制)
1.6 有符号数据表示法
计算机中有符号数据表示法三种:原码、反码、补码。
在计算机中是用补码方式进行存储及用补码进行运算,补码可以让同一套电路即可表示正数和负数以及解决负
数运算等问题。
正数:原码、反码、补码相同
负数:原码符号位为1,反码是符号位不变对数值位进行逐个取反,补码是符号位不变在反码的末尾加1
原码
二进制的左边为高位,右边为低位(一个字节为8bit,就是八个零,第一个是符号位,不参与运算)
二进制最高位作为符号位,0表示正数、1表示负数。
案例:原码表示正7和负7
十进制7的二进制111
符号位 数值位
+7 0 0000111
-7 1 0000111
反码
原码:
符号位 数值位
+7 0 0000111
-7 1 0000111
反码:(正数反码和原码一致,负数符号位不变,数值位按位取反)
+7 0 0000111
-7 1 1111000
补码
原码:
符号位 数值位
+7 0 0000111
-7 1 0000111
反码:
+7 0 0000111
-7 1 1111000
补码:(正数补码和原码一致,负数在反码的末尾加1)
+7 0 0000111
-7 1 1111001
给你一段补码,求补码的十进制。
补码: 1 1111001
- 0 0000001
————————————————
反码: 1 1111000
————————————————
原码: 1 0000111
二 Java变量和数据类型
1.1 变量概述
什么是变量
在程序运行的过程中其值可以在某个范围改变的量
变量的作用
在程序运行过程中存放某一个不断发生改变的值,在运行时JVM会为变量分配一块内存空间
如何定义变量
数据类型 变量名 = 变量值;
在java中定义变量时必须指定数据类型
1.2 数据类型
数据类型概述
在java中数据类型用于限制变量在内存中开辟内存空间大小
数据类型分类
基本数据类型
整数、浮点数、字符、布尔
引用数据类型
类、数组、接口
基本数据类型表
1.3 变量定义
变量定义前提
指定数据类型
指定变量名
指定变量的值
变量定义的格式
数据类型 变量名 = 变量值;
注意:
1.变量值必须与其数据类型符合
2.在同一级大括号{}内不能出现两个相同名称的变量
3.变量未赋值不能使用(局部变量)
4.float类型变量值建议最后加上f,double类型变量值建议最后加
public class Variable {
public static void main(String[] args){
//定义字节型变量
byte b = 100;
System.out.println(b);
//定义短整型变量
short s = 1000;
System.out.println(s);
//定义整型变量
int i = 123456;
System.out.println(i);
//定义长整型变量
long l = 12345678900L;
System.out.println(l);
//定义单精度浮点型变量
float f = 5.5F;
System.out.println(f);
//定义双精度浮点型变量
double d = 8.5;
System.out.println(d);
//定义布尔型变量
boolean bool = false;
System.out.println(bool);
//定义字符型变量
char c = 'A';
System.out.println(c);
}
}
三 Java数据类型转换
3.1 数据类型转换概述
为什么要数据类型转换
Java程序运行时必须保证数据类型一致才能参与运算,如果数据类型不一致就需要进行转换保证数据类型一
致
3.2 数据类型转换之自动类型转换
Java中的默认转换规则
1. boolean类型不能转换为其他的数据类型
2. byte,short,char,int—long—float—double
3. byte,short,char之间不能相互转换,他们参与运算首先转换为int类型
加号说明
在java中+对于整数相加做加法操作,对于字符串做拼接操作
System.out.println('a');//a
System.out.println('a' + 1);//98
ASCII码表的概述
记住三个值:
'0' 48
'A' 65
'a' 97
规则:0 A a:486597;看做是486 597;就是486 (4+1)(8+1)(6+1);后面三位是前面三位加一
案例演示
拼接 加法运算
System.out.println("hello" + 'a' + 1);//hello为字符串,所以拼接helloa1
System.out.println('a' + 1 + "hello");//a为字符,所以做加法运算,98hello
+在有字符串参与中被称为字符串连接符
System.out.println("5+5="+5+5);//字符串,所以为5+5=55
System.out.println(5+5+"=5+5");//基本数据类型 10=5+5
自动转换(隐式转换)案例
int a = 1;//int
byte b = 2;//byte
byte c = a + b;//a转换为byte
int c1 = a + b;//b转换为int
byte a = 1;//byte
byte b = 2;//byte
byte c = a + b;//byte
int c1 = a + b;//a b转换为int
int a = 100;//int
double b = 200d;//double
int c = a + b;//b转换为int
double c1 = a + b;//a转换为double
byte b = 3 + 4;//3和4转换为byte
3.3 数据类型转换之强制转换
目标数据类型 变量名 = (目标数据类型)(被转换的数据);
注意:
强制类型转换可能造成精度损失
byte b1 = 130;
byte b2 = (byte)130;
byte a = 100;
byte b = 100;
byte c = (byte)(a + b);
byte a = 3;
byte b = 4;
byte c = a + b;
int a = 3;
int b = 4;
byte c = (byte)(a + b);
四 Java运算符
4.1 运算符概述
运算符的作用
java中对常量和变量进行操作的符号称为运算符
运算符分类
算术运算符
赋值运算符
比较运算符
逻辑运算符
位运算符
三目运算符
4.2 算术运算符
// 定义两个int类型的变量
int a = 3 ;
int b = 4 ;
// 使用算术运算符
System.out.println(a + b) ; // 7
System.out.println(a - b) ; // -1
System.out.println(a * b) ; // 12
System.out.println(a / b) ; // 0
System.out.println( a % b) ; // 3
System.out.println( -3 % -4) ; // -3
System.out.println( 3 % -4) ; // 3
System.out.println( -3 % 4) ; // -3
++,–运算符的作用
自加(++)自减(--)运算
++:自加。对原有的数据进行+1
--:自减。对原有的数据进行-1
单独运算
++或--放在前或放在后结果没有区别
参与混合运算
++在前先自增1再参与运算,++在后先参与运算再自增1
--在前先自减1再参与运算,--在后先参与运算再自减1
int a = 10;
int b = 10;
int c = 10;
a = b++;
c = --a;
b = ++a;
a = c--;
a=?,b=?,c=?
int x = 4;
int y = (x++) + (++x) + (x*10);
x=?,y=?
4.3 赋值运算符
把右边的值赋值给左边变量,值必须与类型匹配。
下面的程序是否有问题,如果有问题,请指出并说明理由
short s = 1;
s = s + 1;
short s = 1;
s += 1; //+=在底层会进行自动强制类型转换
4.4 比较运算符
比较两个数之间的关系,无论操作时简单还是复杂,结果都是boolean类型
4.5 逻辑运算符
逻辑运算符一般用于连接boolean类型的表达式或者boolean的值
4.6 位运算符
底层是二进制补码进行运算,true用1表示,false用0表示
定义两个变量,无需定义第三方变量的情况下如何实现两个变量的值交换?
用了一个第三方变量
int a = 10;
int b = 20;
int temp = a;
a = b;
b = temp;
int a = 10;
int b = 20;
a = a + b ; // a = 30
b = a - b ; // 30 - 20 = 10 , b=10
a = a - b ; // 30 - 10 = 20 , a=20
一个值被异或两次,其值不会发生改变
int a = 10;
int b = 20;
a = a ^ b ; // 10 ^ 20 = a
b = a ^ b ; // 10 ^ 20 ^ 20 = 10 , b=10
a = a ^ b ; // 10 ^ 20 ^ 10 = 20 , a=20
int a = 10;
int b = 20;
b = (a + b) - (a = b) ; // 30 - 20 = 10 , b=10 , a=20
4.7 三目运算符
什么是三目运算符
三目运算符又称为三元运算符
格式:
(关系表达式) ? 表达式1 : 表达式2;
三元运算符的执行流程
计算关系表达式的值,如果为true, 运算后的结果是表达式1;
如果为false,运算后的结果是表达式2;
int a = 3;
boolean b = a >= 3 ? true : false;
int b1 = a >= 3 ? 3 : -1;
练习题
01.计算机的存储和运算为什么要采用二进制?
02.计算机中的最小表示单位?计算机中的最小存储单位?
03.任意进制到十进制的转换方式?
04.十进制到任意进制之间的转换方式?
05.什么是快速转换法?快速转换法有什么特点?
06.0b1010111转换为10进制,请用快速转换法写出过程?
07.101转换为二进制,请用快速转换法写出过程?
08.什么是有符号数据表示法?
09.为什么要用补码?
10.求十进制-126的补码,写出过程
11.补码0b10000011的原码,请写出过程
12.什么是变量?有什么作用?
13.如果定义一个变量?
14.数据类型分分类?基本类型有哪些?
15.定义变量是有哪些注意事项?
16.java中什么情况数据类型会发生转换?
17.什么是自动转换?转换规则是?
18.什么是强制转换?强制转换可能会导致什么问题?
19.请写出byte b = (byte)130;的运行过程
20.++和--有什么特点?
21.short s = 1; s += 1;会报错吗?为什么?
22.比较运算法有什么作用?
23.&和&&区别?|和||的区别?
24.定义两个变量,无需定义第三方变量的情况下如何实现两个变量的值交换?
25.请写出一个运算法的格式和案例?