1、Java的变量
1.整数类型byte short int long
Java的整形常量默认为int型,long类型的常量后需加l或者L
long a = 213L;
计算机中的最小存储单位是bit,byte是计算机中的基本存储单元 1byte=8bit
bit存的就是数,不是0就是1
**平常说的多少位整数说的就是有几位bit **
1MB=1024KB 1KB=1024B 1byte=8bit
**比如,int是4个字节,1个字节是8bit即8位,所以int是32位,理论上int最大是2的32次方,但是我们还要表示负数,所以要拿出一半表示负数,外加一个0,所以int的最大的正数就是2的31次方-1
**
但是一个int确实有32位,那是如何计算的呢?因为第一位(从左往右)表示的是符号,1代表负数,0代表正数,其他的类似 然后剩下的就有31位,即2的31次方
2.浮点类型float double
3.字符类型char
2、进制
1.不同进制
2.二进制与十进制的转换
2.1二进制转十进制
一般给的二进制数就是补码,这里一定要记清
正数
从右往左看一下哪个位置上的数是1 然后对应乘2的n次方 (n从0开始)
比如
现在求 10101的十进制
我们从右往左看,
第一个位置是1 让其乘2的0次方 1
第三个位置是1 让其乘2的2次方 2
第五个位置是1 让其乘2的4次方 8
将结果想加,为11 所以其十进制数就是11
负数
给了负数的补码,我们要将补码往回转换为源码,然后才能将其转换为十进制
参考3.1节的负数的源码变补码,我们现在回推补码变源码
比如给了一个二进制数(byte型8位)
10111011 第一位是1,为负数
||
先将补码变为反码,就是将末位减一 变为
10111010
||
然后除符号位各位取反就变为了源码
11000101
将其变为十进制数 最左边是符号位,不参与运算
2^0 + 2^2 + 2^6 = 1 + 4 + 64 = 69
符号位是1 表示是个负数 在前面加上负号
所以最终其十进制表示的是 -69
总结
- 正数的二进制转十进制,直接转
- 负数的二进制转十进制,
先将补码末尾减一,然后除符号位按位取反得到源码
,最后转成十进制,加上负号即可
2.2十进制转二进制
除2取余数的逆
3.原码反码补码
3.1存储方式及转换
计算机底层都是以补码
的方式来存储数据
-
正数三码合一,
原码=反码=补码
-
负数的原码是以它的正数二进制表示时,符号位
变为1
反码就是在原码的基础上
除符号位
其他位置按位取反
补码就是在反码的基础上
末位+1
示例:求十进制数14的补码
3.2为什么要使用补码
主要是因为计算机没有减法 计算机在做运算时,都是先将我们的十进制数转换为各自的补码计算,最后将结果转为源码
3、逻辑运算
要求a和b都是布尔类型的变量
- a^b (异或)当a与b相同时,结果为false,a与b不同时结果为true
- **a & b 和 a && b的区别 **以及 a|b 和 a||b的区别
I.当a与b都为true时,
两者没有区别 严格来说当a为true时,两者没有区别 因为b的条件都会判断
II.当a为false时
a & b 会判断b的表达式 即使a为false
a && b 不会判断b的表达式 所以称之为短路与 当第一个条件为false时,b就不会执行了
------------------------------------------------------------------------------
a|b 与 a||b也是类似
I.当a为false时,都会判断b
II.当a为true时,
a | b 还会判断b的表达式
a || b 不会判断b的表达式 称为短路或
4、位运算
&与运算
a & b 进行&运算,将a与b都化为二进制数,然后一一对照,当两位的数都为1
时这一位的结果为1,否则为0
举例
计算 12 & 5
|或运算
a | b 进行|运算,将a与b都化为二进制数,然后一一对照,当两位的数只要有一个为1
那么这一位的结果为1,否则为0
举例
计算 12 | 5
^异或运算
a ^ b 进行^运算,将a与b都化为二进制数,然后一一对照,当两位的数不相同时
那么这一位的结果为1,否则为0
举例
计算 12 ^ 5
~取反运算
~a 操作,就是将a转换为二进制,然后所有的位置
按位取反,包括符号位
举例
计算 ~6
<<左移运算(变大)
- a<<n 就是将a的二进制表示数整体向左移动n位 ,空缺的部分用
0
补 - 有可能一个正数左移之后变为负数了,因为有可能符号位变为了1
在一定范围内
对于a(a是正数)
的影响就是将a乘上2的n次方
>>右移运算(变小)
a>>n
就是将a的二进制表示数整体向右移动n位,如果原二进制数最高位(符号位)是1,那么空缺的部分用1补,原二进制数最高位(符号位)是0,那么空缺的部分用0补,- 在一定范围内对于a
(a是正数)
的影响就是将a除上2的n次方
具体的还是手动计算为准
>>>无符号右移
- 右移运算时如果原数的符号位是1,那么右移之后空缺的数用1补,为0则用0补
- 而无符号右移就是无论原数的最高位是1还是0,右移之后都用0补,
这就会出现原来个负数然后经过无符号右移运算后变成了正数
a>>>n
对于原数(正数)的影响也是a处于2的n次方
总结
5、常用位运算及算法
5.1^异或运算
5.1.1^异或运算法性质
由于^运算,当两个位置上的数相同时结果为0 不相同时结果为1
a^0 a为1的位置异或0是1 a为0的位置异或0为0 所以结果还是a
① a ^ 0 = a
--------------
两个数相同做异或,所有位置都相同,所有位置结果都为0,所以最终结果为0
② a ^ a = 0
-----------------------
满足交换律
③ a ^ b = b ^ a
---------------------------------
满足结合律
③ a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
总结:
- 一个数a与0做异或,结果还是a
- 一个数a与它本身做异或,结果是0
异或操作满足结合律和交换律
5.1.2交换两数
使用异或运算,交换两个数字
int a = 0;
int b = 1;
a = a ^ b;
b = a ^ b; // b = a ^ b ^ b = a
a = a ^ b; // a = a ^ b ^ a = b
5.1.3找只出现一个的元素
力扣136.只出现一次的数字 ——>题解
力扣389.只出现一次的字符 ——>题解
5.2求a的二进制表示中的第k位数
公式 a >> k & 1
思路就是先将a的二进制数右移k位,此时的二进制数的第0位(从右到左的第一位)就是原二进制数的第k位
,然后让右移后的二进制数 & 1即可,(&运算,当两个都是1的话结果为1,其他情况全部为0)
,因为1的二进制表示第0位是1,其他位置全都是0,那么与右移后的数做&运算的结果只看原二进制的第0位数,那么这样就可以将原二进制数的第k位取出了
5.3lowbit(x)
-
作用:返回x的二进制表示中的从左到右
最后一位1及其后面的数
例:10100进行lowbit操作,返回100
-
公式:
x & -x
原理示意图
我们假设x是正数,那么-x就是负数,计算机中的都是以一个数的补码存的,所有我们先要求出-x的补码
,然后在进行&运算