java学习笔记(二)

byte 溢出128快速计算
byte a=100;
a+=50
150-128=22
10010110----第一个1右边值为22
换成反码-1
22-1=21
10010101----第一个1右边值为21
取反7位1
127-21=106由于是负的
所以为-106
同理
100+80=180
180-128=52
52-1=51
127-51=76
-76
同理
150-128=22-1=21
127-21=-106
200-128=72-1=71
127-71=-56

位运算只能操作整数
交换效率最高,但有局限性如上
i^=j;
j^=i;
i^=j;


有一串数字,由n个数字组成,只有一个数出现一次,其他都出现偶数次,怎么找到那个数?
所有数作异或,数与自己异或为0(a^a=0)偶数异或为0,剩下的数就是那个要求的。

6^9
9=8+1
6=4+2
9^6=8+4+2+1
a^b^b=a(因为a^b^b=b^b^a=0^a,异或有交换律)

12|9
12=8+4
9=8+1
所以12|9=8+4+1=13

12&9
12=8+4
9=8+1
所以12&9=8

取反 ~a=-a-1
因为a+~a=1111111111=-1

128-127=-1

11101011
byte
负数原码+补码=128
128-补码*2 
1 1011001
11111111
128-126

11111110
11111100
11111011
10000100  -4
11111101
10000010  -2

10000010  -126  01111101 125
10000001
11111110 126
0001

1111----(-1
1110----(-2
1100----(-4
1001----(-7
1010----
注意,在做移位运算时,移动位数实际上不是直接计算要移动的位数,而是先将这个位数取余32,
然后移动取余32之后的余数
3<<40   -----3<<(40-32)----3<<8
>>负数右移最左边补1,所以1会变多,最终1111111111----即为-1
>>>无符号右移0.

~i=-i-1
int i=5;
i+=i-=i*=~i++
5+5-5*-6=40

在左移没溢出的情况下
对于正数,符号左移,相当于原本2^n前面的0或1转移到了2^(n+1)前面,所以整体变为2倍
对于正数,符号右移,相当于原本2^n前面的0或1转移到了2^(n-1)前面,所以整体变为1/2倍

负数原码不考虑符号位,其他各位相加,代表负数的绝对值
对于负数左移在符号位不溢出的情况下
(即1011111111等,第二位如果是零,代表绝对值超过64,比如前面那个为65,左移必溢出)
所以第二位必为1,所以左移符号位还是负数
(第一个1后面0越多越靠近前面,绝对值越大)因为补码转换原码,原码要1多才大
对于负数,原码+补码=128(在不考虑符号位的情况下)
11001010左移变成10010100,相当于先减去64,再乘2
新的原码+新的补码=128
新的补码=(补码-64)*2
原码+补码=128
新的原码=2*原码

负数右移
新补码+新原码=128
新补码=(补码/2+64)
原码+补码=128
所以新原码=1/2*原码

javac -d D:\\ demo.java(编译到指定位置)

java -cp D:\\ Aoo.b.demo(运行指定class文件)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值