笔记地点:
代码+注释+笔记:
package com.itheima.Operator.youXianJi_YuanBuFanMa;
public class youXianJi {
public static void main(String[] args) {
//知识点: 运算符的优先级
//善于运用()就行,()优于一切
System.out.println(1+2+"欧耶"+4+5);
System.out.println(1+2+"欧耶"+(4+5));
System.out.println(1+2+"欧耶"+4*5);
System.out.println(1+2+"欧耶"+(4*5));
System.out.println("^^");
}
}
笔记地点:
代码+注释+笔记:
package com.itheima.Operator.youXianJi_YuanBuFanMa;
public class YuanBuFanMa {
public static void main(String[] args) {
// 知识点: 原反补码
// 什么是原码?
// 原码: 十进制数据的二进制表现形式,最左边是符号位,0为正,1为负
// 十进制转二进制那就一直除除除 ,前面文章有讲
// 其他进制转十进制那就记公式: 系数*基数的权次幂 然后所有值相加
// 54 -> 00111000
// 0 -> 符号位
// 0111000 -> 数据值
// 在计算机当中,一个0或者一个1,称之为bit,中文名叫比特位
// 一个bit能表示的数据太少了,所以把八个bit分为一组叫做字节
// 字节是计算机当中最小的存储单元
// 1个字节的最大值: 01111111 -> +127
// 1个字节的最小值: 11111111 -> -127
// 原码: 利用原码对正数进行计算是不会有问题的,
// 但是如果是负数计算,结果就出错,实际运算的结果,跟我们预期的结果是相反的.
// 反码: 为了解决原码不能计算负数的问题而出现的
// 计算规则: 正数的反码不变,负数的反码在原码的基础上,符号位不变,数值取反,0变1,1变0.
// 说明反码只针对负数(不管是负数本身,还是负数运算)
// 反码只是辅助运算,十进制转二进制最终结果还是看原码,所以说要记得把反码转换为原码
// 这也就是说反码就是为了弥补原码的不足出现的,是为原码奉献的
// 负数跨0计算会有一个误差,结果需要加1
// 因为0的反码有两种表现形式
// 以-4为例+5,蹦跶5次,十进制结果应该为1,但最终落点在+0那里,结果为0,所以最终结果需要加1
// 原码就是十进制的二进制,即原码就是二进制(只是二进制没有这么规范,要8个bit组成1个字节,又或者说其实二进制也很规范,只是我们学习二进制进行计算的时候都是正数,没有用到负数,导致我们产生了误解,不然你看十进制负数的二进制表现形式就是十进制负数的原码表现形式,都要在符号位上写1表示负数),说明反码是为了弥补二进制的不足出现的
// 十进制相加也不要光死脑筋像5+4就1+1+1+1这样慢慢加
// 可以先转换为5和4的二进制再相加,或者直接先十进制相加为9再转换为二进制
// 第一个: 0000 0101 + 0000 0100 = 0000 1001 注意: 二进制相加的时候要竖着相加像十进制那样,这样更清晰,更准确
// 第二个: 5 + 4 = 9 -> 十进制9转换为其他进制除除除 -> 9 = 0000 1001 tips:这是基础方法,善于运用1248法更快
// 现在超出一个字节的先不要管
// 反码出现是因为原码有缺陷(负数计算不准确)
// 同理补码出现也是因为反码有缺陷(0有两个 +0 -0,跨0计算最终结果需要加1)
// 所以说补码在进行计算的时候求补码那就在反码的基础上加1,反过来求反码那就在补码的基础上减1
// 总结: 在进行十进制数值转换为原反补(码)数值的时候,
// 正数直接转原码就行,反码补码和原码一样
// 负数先转换为反码,再通过反码转换为原码或者补码
// 可怜的-128只有补码没有原码反码
// 但是不碍事
// 因为在计算机当中数字的存储和计算都是以补码的形式来操作的
// 所以我们说一个字节它的取值范围是 -128到+127
// 基本数据类型
// 例如同一个整数类型的区别
// 区别是它们占用的字节不同
// byte类型 1个字节 8个比特位
// short类型 2个字节 16个比特位
// int类型 4个字节 32个比特位
// long类型 8个字节 64个比特位
// 所以就可以解释隐式转换和强制转换
// 隐式转换: 前面补零
// 强制转换: 把多字节的变为少字节的
// 注意: 输出打印的是十进制的值,因为我们给计算机的是十进制,但是它只会二进制,所以将我们的十进制转换为它理解的二进制,再将二进制计算结果转换为十进制输出给我们
// 还要注意它们不管转换前还是转换后的二进制数值都是以补码的形式表现的,因为在计算机中数字的计算和存储都是以补码的形式进行的
// 还要学会计算器的字节计算,字节计算就是用补码的形式来计算的
/* 就比如下面这个例子
计算器输值: 二进制0100 1000 -> 十进制72 -> 按理说 -72 就是 1100 1000 但是在计算器当中输出的是 -56
计算器输值: 1100 1000 -> -56
原因就是在计算机当中数字的计算与存储都以补码的表现形式进行运算
说明上述的 计算器输值: 1100 1000 输的是补码
要注意正数原码反码补码是二进制本身,但负数的二进制本身要先通过反码再求出原码,原码就是负数的二进制本身,但如果要用计算器进行计算,就要注意我们看到的二进制都是正负数的补码
总结:
如果要用计算器进行十进制转二进制 -> 我们知道出来的都是补码,因为计算器只显示补码,所以正数直接得到二进制本身(原码)[补码 = 反码 = 原码],负数出来的当然也是补码,然后通过我们自己计算将补码转换为反码(补码-1),再转换为原码(符号位不变,数据值反过来),最后的原码才是负数的二进制本身 */
// -4的补码就是-3的反码
// 所以说: -4的补码-1就相当于-3的反码-1 = -4的反码
System.out.println("^^");
}
}
package com.itheima.Operator.youXianJi_YuanBuFanMa;
public class YuanBuFanMaDemo1 {
public static void main(String[] args) {
int a = -2;
int b = -4;
System.out.println(a & b);
// System.out.println(a | b);
// 出问题了,负数算不出来,先留着这个问题,看下一个
// bbql, | 也是一样,负数算不出来
// 解决了,看了后面课程,右移知识点 -> 高位补0或1
// 问题出在高位补1,我用计算器算的时候,计算器高位给我补的全是1,因为是负数嘛,但是我当时不知道,一直将1也计算
System.out.println("^^");
}
}
//二进制竖着计算时
//向前借1,1(变量名)表变量,数据值实为2
//十进制竖着计算时
//向前借1,1(变量名)表变量,数据值实为10
package com.itheima.Operator.youXianJi_YuanBuFanMa;
public class YuanBuFanMaDemo2 {
public static void main(String[] args) {
// 运算符 <<
// 含义 左移
// 运算规则 向左移动,低位补0
// 运算符 >>
// 含义 右移
// 运算规则 向右移动,高位补0或1(正数补0负数补1)
// 运算符 >>>
// 含义 无符号右移
// 运算规则 向右移动,高位补0(不管是正数还是负数都补0)
int a = -200;
System.out.println(a >> 2);
System.out.println("^^");
}
}
反码只是辅助运算,十进制转二进制最终结果还是看原码,所以说要记得把反码转换为原码 这也就是说反码就是为了弥补原码的不足出现的,是为原码奉献的
负数跨0计算会有一个误差,最终结果需要加1 因为0的反码有两种表现形式 以-4+5为例,蹦跶5次,十进制结果应该为1,但最终落点在+0那里,结果为0,所以最终结果需要加1 原码就是十进制的二进制,即原码就是二进制(只是二进制没有这么规范,要8个bit组成1个字节,又或者说其实二进制也很规范,只是我们学习二进制进行计算的时候都是正数,没有用到负数,导致我们产生了误解,不然你看十进制负数的二进制表现形式就是十进制负数的原码表现形式,都要在符号位上写1表示负数),说明反码是为了弥补二进制的不足出现的
十进制相加也不要光死脑筋像5+4就1+1+1+1这样慢慢加 可以先转换为5和4的二进制再相加,或者直接先十进制相加为9再转换为二进制 第一个: 0000 0101 + 0000 0100 = 0000 1001 注意: 二进制相加的时候要竖着相加像十进制那样,这样更清晰,更准确 第二个: 5 + 4 = 9 -> 十进制9转换为其他进制除除除 -> 9 = 0000 1001 tips:这是基础方法,善于运用1248法更快
反码出现是因为原码有缺陷(负数计算不准确) 同理补码出现也是因为反码有缺陷(0有两个 +0 -0,跨0计算最终结果需要加1) 所以说补码在进行计算的时候求补码那就在反码的基础上加1,反过来求反码那就在补码的基础上减1 总结: 在进行十进制数值转换为原反补(码)数值的时候, 正数直接转原码就行,反码补码和原码一样 负数先转换为反码,再通过反码转换为原码或者补码
可怜的-128只有补码没有原码反码 但是不碍事 因为在计算机当中数字的存储和计算都是以补码的形式来操作的 所以我们说一个字节它的取值范围是 -128到+127
基本数据类型 例如同一个整数类型的区别 区别是它们占用的字节不同 byte类型 1个字节 8个比特位 short类型 2个字节 16个比特位 int类型 4个字节 32个比特位 long类型 8个字节 64个比特位
所以就可以解释隐式转换和强制转换 隐式转换: 前面补零 强制转换: 把多字节的变为少字节的 注意: 输出打印的是十进制的值,因为我们给计算机的是十进制,但是它只会二进制,所以将我们的十进制转换为它理解的二进制,再将二进制计算结果转换为十进制输出给我们 还要注意它们不管转换前还是转换后的二进制数值都是以补码的形式表现的,因为在计算机中数字的计算和存储都是以补码的形式进行的 还要学会计算器的字节计算,字节计算就是用补码的形式来计算的
隐式转换: 前面补零
强制转换: 把多字节的变为少字节的
强制转换的正数情况
强制转换的负数情况
计算器的字节计算,字节计算就是用补码的形式来计算的
就比如下面这个例子
计算器输值: 二进制 0100 1000 -> 十进制 72 -> 按理说 -72 就是 1100 1000 但是在计算器当中输出的是 -56
计算器输值: 1100 1000 -> -56
原因就是在计算机当中数字的计算与存储都以补码的表现形式进行运算
说明上述的 计算器输值: 1100 1000 输的是补码
要注意正数原码反码补码是二进制本身,但负数的二进制本身要先通过反码再求出原码,原码就是负数的二进制本身,但如果要用计算器进行计算,就要注意我们看到的二进制都是正负数的补码
总结:
如果要用计算器进行十进制转二进制 -> 我们知道出来的都是补码,因为计算器只显示补码,所以正数直接得到二进制本身(原码)[补码 = 反码 = 原码],负数出来的当然也是补码,然后通过我们自己计算将补码转换为反码(补码-1),再转换为原码(符号位不变,数据值反过来),最后的原码才是负数的二进制本身
最后:
说了这么多,最重要的就是一句话:
在计算机当中,数字的计算与存储都是以补码的形式进行的
解析这句话: 在计算机当中,计算机只会二进制,而二进制又有原码,反码,补码的表现形式,不能选原码(负数计算不准确)和反码(0有两个 +0 -0),因为它俩有局限性,最后为了解决它们的局限性就创造出来了补码,所以最终计算机就以二进制的补码形式进行一切计算与存储,所以我们不管给计算机什么数字,十进制也好,八进制也好,它通通都会转换为二进制的补码形式再进行运行
如下图
运用逻辑运算符进行计算的时候
计算机自动将十进制转换为二进制进行计算
输出二进制的十进制结果
比特位挨个计算,都为true结果才为true
计算机很贴心,我们给出十进制,那它就还给我们十进制,只是过程是它自己用二进制的补码形式进行运算的
逻辑或
逻辑或
左移
小公式:
左移一次就是 *2
右移
小公式:
右移一次就是 /2
右移两次那就是 /4
注意高位补0是因为原来是正数,补1是因为原来是负数,补0前面全是0,补1全面全是1
-4的反码变补码需要加1,因为-4的补码等于-3的反码,所以想要求-4的补码,那就是求-3的反码,那就是-4反码加1等于-3的反码等于-4的补码
-4的补码变反码需要减1,因为-4的补码等于-3的反码,所以想要求-4的反码,那就是让-3的反码减1,-3的反码减1等于-4的反码等于-4的补码减1
它们是一个三角形的关系
二进制竖着计算时 向前借1,1(变量名)表变量,数据值实为2 十进制竖着计算时 向前借1,1(变量名)表变量,数据值实为10
运算符 >>> 含义 无符号右移 运算规则 向右移动,高位补0(无论正负都补0)
详情看《2.其他笔记: -> 7.》,正数可以算,负数算不出来
package com.itheima.Operator.youXianJi_YuanBuFanMa;
public class YuanBuFanMaDemo1 {
public static void main(String[] args) {
int a = -2;
int b = -4;
// System.out.println(a & b);
System.out.println(a | b);
// 出问题了,负数算不出来,先留着这个问题,看下一个
// bbql, | 也是一样,负数算不出来
System.out.println("^^");
}
}
//向前借1,1表变量名,数据值实为2
// 解决了,看了后面课程,右移知识点 -> 高位补0或1 // 问题出在高位补1,我用计算器算的时候,计算器高位给我补的全是1,因为是负数嘛,但是我当时不知道,一直将1也计算