2020-02-03

二进制算法

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

你可能感兴趣的:(2020-02-03)