二进制的算法
我们经常听到十进制数和二进制数,在计算机中经常用二进制来计算,怎样才能把我们常见的十进制数转换为二进制数呢?
这里我们以十进制数68为例,8*10的0次方+6*10的一次方
45 5*10的0次方+4*10的一次方
145 5*10的0次方+4*10的一次方+1*10的二次方
计算机中的2进制
01.原码
02.反码
03.补码
1 byte=8 bit;
01.java中所有的数字都是有符号! 数字的最高位(最左边的)就是符号位!
红色标注的为高位 0代表正数 1代表负数
十进制的1 转换为二进制就是 0 0 0 0 0 0 0 1
十进制的-1 转换为二进制就是 1 0 0 0 0 0 0 1
02.正数的原码,反码,补码都是一样的!
03.负数的反码=符号位不变+其他位取反
04.负数的补码=反码+1
反码=补码-1
05.计算机在运行的过程中 都是以 《补码》 运算的!
1+1
0 0 0 0 0 0 0 1
+ 0 0 0 0 0 0 0 1
------------------------- 逢2进1
0 0 0 0 0 0 1 0 结果为2
-2+1
1 0 0 0 0 0 1 0 ===》-2的原码 需要转换为反码
1 1 1 1 1 1 0 1 ===》-2的反码 需要转换为补码
1 1 1 1 1 1 1 0 ===》-2的补码 补码才能参与运算
+ 0 0 0 0 0 0 0 1 ===》 1的补码 正数的 原码 反码 补码 都一样
-------------------------
1 1 1 1 1 1 1 1 ===》 结果为补码 需要转换为反码 再转换为原码
1 1 1 1 1 1 1 0 ===》 结果为反码
1 0 0 0 0 0 0 1 ===》 原码 结果为-1
java中的位运算
01.& :按位与 两位全为1,结果为1
2&3
运算过程:
0 0 0 0 0 0 1 0 ==》2的补码
& 0 0 0 0 0 0 1 1 ==》3的补码
---------------------------------
0 0 0 0 0 0 1 0 ==》 结果2
02.| :按位或 两位有一个为1,结果为1
2|3
运算过程:
0 0 0 0 0 0 1 0 ==》2的补码
| 0 0 0 0 0 0 1 1 ==》3的补码
---------------------------------
0 0 0 0 0 0 1 1 ==》 结果3
03.~ :按位取反 :所有的0变成1,所有的1变成0 (仅限于一个表达式使用)
~3
0 0 0 0 0 0 1 1 ==》3的补码
~
---------------------------------
1 1 1 1 1 1 0 0 负数 这是原码
1 0 0 0 0 0 1 1 反码
1 0 0 0 0 1 0 0 补码
~-5
1 0 0 0 0 1 0 1 ==》 -5的源码
1 1 1 1 1 0 1 0 ==》 -5的反码
1 1 1 1 1 0 1 1 ==》-5的补码
~
----------------------------------
0 0 0 0 0 1 0 0 ==》 4
04. ^ :按位异或 两位一个是1一个是0,结果才是1
2^3
0 0 0 0 0 0 1 0
^ 0 0 0 0 0 0 1 1
-----------------------------
0 0 0 0 0 0 0 1 ==>!
算术右移:符号位不变 ,低位溢出
10 >> 2
0 0 0 0 1 0 1 0
0 0 0 0 1 0 1 0
--------------------------------
0 0 0 0 0 0 1 0
算术右移:符号位不变 ,低位补0
2 << 2
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 0
---------------------------
0 0 0 0 1 0 0 0 ==》2的三次方