二進制算法
1.java中計算機算法
有符號算法 源碼? ?反碼? ?補碼
二進制中最高位為符號位? 正數(shù)為0? ? ? 負數(shù)為1
正數(shù)的源碼遍搞、反碼造挽、補碼都一樣
注意0的反碼景用、補碼都為0
負數(shù)的反碼高位符號位不變其他位取反
負數(shù)的補碼+1
負數(shù)的補碼-1
反碼符號位不變其他取反
在java中沒有無符號數(shù)形庭,也就是說都是有符號數(shù)萌踱,計算機在運算時都是以補碼的方式運算的
計算機的運算過程1>>2
00000000?00000000?00000000?00000001?
正數(shù)的反碼補碼都是一樣的
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
取反后高位為負數(shù) 補碼 -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? 右移的如果是負數(shù)那么符號位直接為0,高位補零低位溢出
8? ? ? ??0000 1000
a=?0000 0010