二进制算法
1.java中计算机算法
有符号算法 源码 反码 补码
二进制中最高位为符号位 正数为0 负数为1
正数的源码、反码、补码都一样
注意0的反码、补码都为0
负数的反码高位符号位不变其他位取反
负数的补码+1
负数的补码-1
反码符号位不变其他取反
在java中没有无符号数,也就是说都是有符号数,计算机在运算时都是以补码的方式运算的
计算机的运算过程1>>2
00000000 00000000 00000000 00000001
正数的反码补码都是一样的
00000000 00000000 00000000 00000001
右移2位
00000000 00000000 00000000 00000000
所以1右移两位为0
计算机的运算过程 -1>>2
源码
10000000 00000000 00000000 00000001
反码 符号位不变其他取反
11111111 11111111 11111111 11111110
补码 +1
11111111 11111111 11111111 11111111
右移两位 高位以符号位补充 低位溢出
11111111 11111111 11111111 11111111
补码 -1
11111111 11111111 11111111 11111110
反码->源码 符号位不变其他取反
10000000 00000000 00000000 00000001
2.与或非异或算法
&与运算 遇0得0 只有两个都为1时为1 列a= 5 & 3
5 0000 0101
3 0000 0011
a= 0000 0001
|或运算 遇1得1 只要两个有一个为1就为1 列a= 5 | 3
5 0000 0101
3 0000 0011
a= 0000 0111
~非运算 各位取反 a=~2
源码-反码-补码都是一样的
00000000 00000000 00000000 00000010
取反
11111111 11111111 11111111 11111101
取反后高位为负数 补码 -1
11111111 11111111 11111111 11111100
反码 ->源码
10000000 00000000 00000000 00000011
a= -3
^异或运算 两位 相同为0 不行同为1 列a= 5 ^ 3
5 0000 0101
3 0000 0011
a= 0000 0110
>>>无符号右移 列a= 8 >>> 2 右移的如果是负数那么符号位直接为0,高位补零低位溢出
8 0000 1000
a= 0000 0010