数据类型与运算

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.只出现一次的数字 ——>题解

力扣268.丢失的数字——>题解

力扣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的补码,然后在进行&运算

在这里插入图片描述

力扣.231-2的幂
力扣.剑指Offer15.二进制中一的个数

猜你喜欢

转载自blog.csdn.net/qq_46312987/article/details/119744398
今日推荐