java基础学习笔记2(各种运算符和赋值类型转换)

1、int转byte

首先,计算机里都是以补码形式存储的;

补码:
  • 正数的补码与原码相同,负数的补码为 其原码除符号位外所有位取反(得到反码了),然后最低位加1。

int 4个字节 32位;
byte 1个字节 8位;
int --》byte会截取int的后8位,截取后,第一位(符号位)为1(负数),求符号位之后7位的补码,转为10进制即最终结果。

int 200 转为 byte
十进制:二进制
200:0000 0000 0000 0000 0000 0000 1100 1000
截取后八位:1100 1000 (符号位位1,即负数)
求后7位的补码,取反加一得
:011 1000:56----》加上符号位 1011 1000 即:-56

int 300 转为 byte
300:0000 0000 0000 0000 0000 0001 0010 1100
后八位: 0010 1100 (正数)
即:0010 1100:44

2、++、- -

加加和减减
在前就先赋值再运算,在后就先运算再赋值

int a = 5;
int b = (++a)+(a++)+(++a);
(++a):此时 先赋值 a=6 、再运算 (++a)=6;
(a++):此时 先运算(a++)=6 、再赋值 a=7;
(++a):此时 先赋值 a=8 、再运算 (++a)=8
即 6+6+8=20

3、“+=”、“-=”

a = a+b;
a+=b;
这两个表达的意思是一样的;
但是+= 会自动转换类型(强转),会损失精度

int a = 5; byte b = b + a; 会编译错误,因为int转byte需要强转
byte a = 5; byte b +=a; 没错,但是会损失精度,因为他的结果自动强转成byte类型了

4、&&、&、||、|

&&和|| 具有短路性
-----&&:第一个false,第二个就不会再判断
-----||:第一个true,第二个也不会在判断
&和|:
-----全判断

5、位运算

&:按位与 如果相对应位都是1,则=为1,否则为0
(A&B)
--------------------------------------------------------------------------------------------
|:按位或 如果相对应位都是0,则=为0,否则为1
(A | B)
--------------------------------------------------------------------------------------------
~:按位非 按位取反运算符翻转操作数的每一位,即01互换
(〜A)
--------------------------------------------------------------------------------------------
^:按位异或 如果相对应位值相同,则=为0,否则为1
(A ^ B)
--------------------------------------------------------------------------------------------
<<左位移运算符 左操作数按位左移右操作数指定的位数。
A << 2
--------------------------------------------------------------------------------------------
>>右位移运算符 左操作数按位右移右操作数指定的位数
A >> 2
----------------------------------------------------------------------------------------------
\ \ 左操作数的值按右操作数指定的位数右移 \
>>> 无符号右移 移动得到的空位以零填充
A>>>2
----------------------------------------------------------------------------------------------
优先级S:~ 波浪
优先级A:<<、>>和>>>
优先级B:&
优先级C:^
优先级D:/
*/

我为什么要它?
答案1:位运算的运算效率比直接对数字进行加减乘除高很多(至于为什么会快,不明白的可以去搜下为什么C的代码执行速度比Java,python快),代码需要考虑性能的时候

答案2:因为大牛都喜欢这样,估计是炫技吧!

使用

  • 场景1:判断奇偶数 a&1 结果为 0 ,a就是偶数 结果为 1 ,a就是奇数

  • 场景2:求平均数 (x+y)/2 这样吗?考虑过 x+y可能超过int的范围吗?正确的姿势是 (x&y)+((x^y)>>1)

  • 场景3:有两个int类型变量x、y,要求两者数字交换,不用临时变量?(当年学java的时候这可是奥数级别的题目)
    x ^= y; y ^=x; x ^= y;

  • 场景4:求绝对值

    int abs( int x ) { int y= x >> 31 ; return (x^y)-y ; //or: (x+y)^y }

  • 场景5:取模 a % (2^n) 等价于 a & (2^n - 1)

  • 场景6:快速乘法 a * (2^n) 等价于 a << n

  • 场景7:快速除法 a / (2^n) 等价于 a >> n

  • 场景8:求相反数 (~x+1)

总之,整型所涉及到的操作它都可以更快速的实现,有兴趣可以仔细研究。

(转自:https://www.cnblogs.com/yuanhailiang/p/9479105.html)

1是对 0是错
1是负数 0是整数
& 与运算:只有1 1 是 1,其他都是 0

6、赋值要点

》整数常量默认是int
如果要使用long范围的数字,赋值时在数字后面加字母L(不在long的范围可以不加,int转long自动转)
》小数常量默认:double
如果要表示4个字节的小数,需要使用float,定义时在小数后加字母F

》赋值语句中:小转大自动转,大转小要强转
float a = 2.0;//向下转型,double --》 float
float a1 = 2.0f;
double b = 2.0; //正确 double – double
int c = 2; //正确 int <-- int
long d = 2; //正确;long <-- int
int f = 2.0;//int <-- double 错
int g = 2L; //错误:int <-- long
byte e = 127;//给byte赋值 127及以下都不报错??? byte <-- int ???

为什么给byte赋值为int 编译能通过呢?

注意:
byte, short, int, long这些整数默认都是int型,都是以int型计算的,只要不超过他们的取值范围就可以进行赋值。
byte 为1字节 -128~127
short为2字节 -32,768~32,767
int为4字节 -2,147,483,648~2,147,483,647
long 为8字节 -9,223,372,036,854,775,808L~9,223,372,036,854,775,807L
而char为2字节 0~65535
*/

位运算交换两个变量的值

首先有个原理需要知道:
若a^b=c,则c^b=a,c^a=b
可通过穷举法进行证明
穷举法

引自:https://blog.youkuaiyun.com/qq_22986837/article/details/53413454

那么就可以通过以下方式进行两个变量的交换
a=a^b; 此时a为 c
b=a^b; 此时 b = c^b = a
a=a^b; 此时 a = c^a = b


a ^= b; b ^=a; a ^= b;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值