嗯仆百,昨天在復(fù)習(xí)java的時候遇到進(jìn)制計算和反碼補(bǔ)碼原碼的轉(zhuǎn)換糖权,腦子里沒什么印象了堵腹,還是好記性不如爛筆頭啊~
寫在最前面的是幾位大佬對這些東西的理解
_天行健反碼補(bǔ)碼原碼原文鏈接
小猴子monkey1024位運(yùn)算原文鏈接
位運(yùn)算
位運(yùn)算符:
& 位與
| 位或
^ 位異或
~ 取反
移位運(yùn)算符:
>> 向右移
>>> 無符號右移
<< 向左移
位運(yùn)算符都是操作的二進(jìn)制
用法:
&,|,^,~ 的用法
&:有0則0
|:有1則1
^:相同則0,不同則1
~:按位取反
例子:
System.out.println(6 & 3); //2
System.out.println(6 | 3); //7
System.out.println(6 ^ 3); //5
System.out.println(~6); //-7?
分析:
上面這些運(yùn)算符會將數(shù)字轉(zhuǎn)換成2進(jìn)制再進(jìn)行運(yùn)算星澳。6的二進(jìn)制是110,3的二進(jìn)制是011疚顷。根據(jù)上面的用法規(guī)則里面,列幾個豎式:
例子1:
110
011
———–
010 &計算出十進(jìn)制的2
例子2:
110
011
———–
111 |計算出十進(jìn)制的7
例子3:
110
011
———–
101 ^計算出十進(jìn)制的5
如果不了解原碼反碼補(bǔ)碼的同學(xué)沒有關(guān)系,這部分作為了解即可
00000000 00000000 00000000 00000110 6的原碼反碼補(bǔ)碼都是本身
11111111 11111111 11111111 11111001 對6取反腿堤,得到-7的補(bǔ)碼
00000000 00000000 00000000 00000001 補(bǔ)碼減1
——————————————————————————
11111111 11111111 11111111 11111000 反碼
10000000 00000000 00000000 00000111 原碼(-7)
^的特點:一個數(shù)據(jù)對另一個數(shù)據(jù)位異或兩次阀坏,該數(shù)本身不變。
例子:
System.out.println(5 ^ 10 ^ 5);
左移和右移
<<:左移 左邊最高位丟棄笆檀,右邊補(bǔ)齊0
>>:右移 最高位是0忌堂,左邊補(bǔ)齊0;最高為是1,左邊補(bǔ)齊1
>>>:無符號右移 無論最高位是0還是1酗洒,左邊補(bǔ)齊0
例子:
//右移,向右移動n位就是除以2的n次冪士修,向左移動n位就是乘以2的n次冪
System.out.println(12 >> 1);
System.out.println(12 >> 2);
System.out.println(12 << 1); //24
System.out.println(12 << 2); //48
進(jìn)制運(yùn)算
進(jìn)制也就是進(jìn)制位,對于接觸過電腦的人來說應(yīng)該都不陌生寝蹈,我們常用的進(jìn)制包括:二進(jìn)制李命、八進(jìn)制、十進(jìn)制與十六進(jìn)制箫老,它們之間區(qū)別在于數(shù)運(yùn)算時是逢幾進(jìn)一位封字。比如二進(jìn)制是逢2進(jìn)一位,十進(jìn)制也就是我們常用的0-9是逢10進(jìn)一位耍鬓。
二進(jìn)制與十進(jìn)制之間的轉(zhuǎn)換
-
十進(jìn)制轉(zhuǎn)二進(jìn)制
方法為:十進(jìn)制數(shù)除2取余法阔籽,即十進(jìn)制數(shù)除2,余數(shù)為權(quán)位上的數(shù)牲蜀,得到的商值繼續(xù)除2笆制,依此步驟繼續(xù)向下運(yùn)算直到商為0為止。
十進(jìn)制轉(zhuǎn)二進(jìn)制 -
二進(jìn)制轉(zhuǎn)十進(jìn)制
方法為:把二進(jìn)制數(shù)按權(quán)展開涣达、相加即得十進(jìn)制數(shù)在辆。
二進(jìn)制轉(zhuǎn)十進(jìn)制 二進(jìn)制與八進(jìn)制之間的轉(zhuǎn)換
-
二進(jìn)制轉(zhuǎn)八進(jìn)制
方法為:3位二進(jìn)制數(shù)按權(quán)展開相加得到1位八進(jìn)制數(shù)。(注意事項度苔,3位二進(jìn)制轉(zhuǎn)成八進(jìn)制是從右到左開始轉(zhuǎn)換匆篓,不足時補(bǔ)0)。
二進(jìn)制轉(zhuǎn)八進(jìn)制 八進(jìn)制轉(zhuǎn)成二進(jìn)制
方法為:八進(jìn)制數(shù)通過除2取余法寇窑,得到二進(jìn)制數(shù)鸦概,對每個八進(jìn)制為3個二進(jìn)制,不足時在最左邊補(bǔ)零甩骏。
反碼補(bǔ)碼原碼
二進(jìn)制與十六進(jìn)制之間的轉(zhuǎn)換
-
二進(jìn)制轉(zhuǎn)十六進(jìn)制
方法為:與二進(jìn)制轉(zhuǎn)八進(jìn)制方法近似窗市,八進(jìn)制是取三合一,十六進(jìn)制是取四合一饮笛。(注意事項咨察,4位二進(jìn)制轉(zhuǎn)成十六進(jìn)制是從右到左開始轉(zhuǎn)換,不足時補(bǔ)0)福青。
二進(jìn)制轉(zhuǎn)十六進(jìn)制 -
十六進(jìn)制轉(zhuǎn)二進(jìn)制
方法為:十六進(jìn)制數(shù)通過除2取余法扎拣,得到二進(jìn)制數(shù),對每個十六進(jìn)制為4個二進(jìn)制,不足時在最左邊補(bǔ)零二蓝。
十六進(jìn)制轉(zhuǎn)二進(jìn)制 -
十進(jìn)制與八進(jìn)制與十六進(jìn)制之間的轉(zhuǎn)換
十進(jìn)制轉(zhuǎn)八進(jìn)制或者十六進(jìn)制有兩種方法
第一:間接法—把十進(jìn)制轉(zhuǎn)成二進(jìn)制誉券,然后再由二進(jìn)制轉(zhuǎn)成八進(jìn)制或者十六進(jìn)制。這里不再做圖片用法解釋刊愚。
第二:直接法—把十進(jìn)制轉(zhuǎn)八進(jìn)制或者十六進(jìn)制按照除8或者16取余踊跟,直到商為0為止。
十進(jìn)制轉(zhuǎn)八進(jìn)制或者十六進(jìn)制 -
八進(jìn)制或者十六進(jìn)制轉(zhuǎn)成十進(jìn)制
方法為:把八進(jìn)制鸥诽、十六進(jìn)制數(shù)按權(quán)展開商玫、相加即得十進(jìn)制數(shù)。
八進(jìn)制或者十六進(jìn)制轉(zhuǎn)成十進(jìn)制 十六進(jìn)制與八進(jìn)制之間的轉(zhuǎn)換
八進(jìn)制與十六進(jìn)制之間的轉(zhuǎn)換有兩種方法
第一種:他們之間的轉(zhuǎn)換可以先轉(zhuǎn)成二進(jìn)制然后再相互轉(zhuǎn)換牡借。
第二種:他們之間的轉(zhuǎn)換可以先轉(zhuǎn)成十進(jìn)制然后再相互轉(zhuǎn)換拳昌。原碼是什么?
原碼就是早期用來表示數(shù)字的一種方式: 一個正數(shù)钠龙,轉(zhuǎn)換為二進(jìn)制位就是這個正數(shù)的原碼炬藤。負(fù)數(shù)的絕對值轉(zhuǎn)換成二進(jìn)制位然后在高位補(bǔ)1就是這個負(fù)數(shù)的原碼
舉例說明:
int類型的 3 的原碼是 11B(B表示二進(jìn)制位), 在32位機(jī)器上占四個字節(jié)碴里,那么高位補(bǔ)零就得:
00000000 00000000 00000000 00000011
int類型的 -3 的絕對值的二進(jìn)制位就是上面的 11B 展開后高位補(bǔ)零就得:
10000000 00000000 00000000 00000011
但是原碼有幾個缺點沈矿,零分兩種 +0 和 -0 。很奇怪是吧咬腋!還有羹膳,在進(jìn)行不同符號的加法運(yùn)算或者同符號的減法運(yùn)算的時候,不能直接判斷出結(jié)果的正負(fù)根竿。你需要將兩個值的絕對值進(jìn)行比較陵像,然后進(jìn)行加減操作 ,最后符號位由絕對值大的決定寇壳。于是反碼就產(chǎn)生了蠢壹。
-
反碼是什么 ?
正數(shù)的反碼就是原碼九巡,負(fù)數(shù)的反碼等于原碼除符號位以外所有的位取反
舉例說明:
int類型的 3 的反碼是
00000000 00000000 00000000 00000011
和原碼一樣沒什么可說的
int類型的 -3 的反碼是
11111111 11111111 11111111 11111100
除開符號位 所有位 取反
解決了加減運(yùn)算的問題,但還是有正負(fù)零之分蹂季,然后就到補(bǔ)碼了
- 補(bǔ)碼是什么冕广?
正數(shù)的補(bǔ)碼與原碼相同,負(fù)數(shù)的補(bǔ)碼為 其原碼除符號位外所有位取反(得到反碼了)偿洁,然后最低位加1.
還是舉例說明:
int類型的 3 的補(bǔ)碼是:
00000000 00000000 00000000 00000011
int類型的 -3 的補(bǔ)碼是
11111111 11111111 1111111 11111101
就是其反碼加1
最后總結(jié)一下:
1.正數(shù)的反碼和補(bǔ)碼都與原碼相同撒汉。
2.負(fù)數(shù)的反碼為對該數(shù)的原碼除符號位外各位取反。
3.負(fù)數(shù)的補(bǔ)碼為對該數(shù)的原碼除符號位外各位取反涕滋,然后在最后一位加1
各自的優(yōu)缺點:
1.原碼最好理解了睬辐,但是加減法不夠方便,還有兩個零。
2.反碼稍微困難一些溯饵,解決了加減法的問題侵俗,但還是有有個零。
3.補(bǔ)碼理解困難丰刊,其他就沒什么缺點了