1.各進位之間的轉化
在計算機科學中,常用的進位有二進位、八進位、十進位和十六進位。在開發過程中使用比較多的是二進位和十進位的。如果涉及一些字節編碼操作,十六進位也會用得到,甚至可能會用到三十二進位。
1.1 十進位向其它進位轉化
以正常的十進位數為標準,如果將一個十進位數轉化成二進位數。可以使用除法取餘的方式進行,在下圖中我們用二進位和八進位進行舉例:
上圖所描述的是一個正整數轉化成各進位的算法描述。如果被轉化數是負數,需要經過三步轉化:1.先計算出其正整數的二進位碼。2.再計算其反碼。3.再計算補碼。以-5為例子,計算的二進位如下圖所示:
在不同的計算機語言中,負數的二進位碼不一定相同,因為這取決於各種數據所佔有的內存長度(字節數)。例如在Java中,int佔據4個字節(32位),而long類型佔據的是8個字節(64位),它們在計算-5時的二進位數是不同的。
如果我們無法確定數據所佔據的內存大小,也就無法準確的描述出負數的各進位數值,只能以正數的進位表示,然後增加一個負號。這也是Java中,大整型BigInteger處理的方式。
其它進位向十進位轉化
其它進位向十進位轉化,可以通過按權展開求和的方式進行。假設數值A為N進位數,則其十進位值D的值公式如下:
AmaxBit*Nbit-1 +Amaxbit-1*Nbit-2 +…… + A1N0
其中maxbit為A的最高位數值(A1表示個位數值,Amaxbit表示最高位數值),bit為A的總位數。如果二進位11001和十六進位FFEE轉化成十進位,按照上述公式展開如下:
11001的十進位:1*24+1*23+0*22+0*21+1*0=16+8+0+0+1=25FFEE的十進位:15*163+15*162+14*161+140=61440+3840+224+14=65518其它進位向十進位進行轉化也是按照這個展開公式進行。
2.使用Swing圖形化
我們的主要目的是將進位的轉化用圖形化的方式進行處理,通過GUI界面的形式展現出來。需要我們完成的主要工作如下:
由用戶輸入各種進位的數值,輸入的進位可以調節,但需要控制輸入的總長度。輸出通用的四種進位(二、八、十、十六進位),可以自定義一種輸出進位。進位轉化的顯示是實時的。此外,由於手動輸入數值,可能會超過Java基礎數據的限制,無法確定位數。在轉化負數的時候無法通過補碼來完成,我們的核心轉化工作可以由BigInteger來實現。
在設計GUI界面的時候,我們需要設計四個部分的組件群:
輸入進位控制組件:可使用的組件有JSlider(滑杆)和JComboBox(下拉列表)。進位的轉化範圍可以從二進位到三十六進位,在圖形化中我們可以用滑杆JSlider來處理。JSlider的可以設置成最小值為2,最大值為36,默認值為10。移動單位為1。另外可以並通過一個JLabel組件實時跟蹤滑杆數據變化狀態。輸出進位控制組件:同上。輸入組件:輸入組件可以使用JTextField,在輸入內容的時候,需要對文本進行監控,不能輸入超出轉化範圍的字符。例如三十六進位只能輸入1~9和a到z範圍內的字符。文本控制可以通過Document監聽器進行控制。轉化後的輸出組件:轉化後的輸出組件由五個JLabel構成,分別對應二進位、八進位、十進位、十六進位以及自定義進位。2.1 GUI組件搭建
除了必要操作組件和顯示組件外了,還可以添加一些額外的組件用於界面的裝飾和說明。界面搭建如下圖所示(供參考):
功能分析
由我們手動操作的組件有三個,需要進行一些變量的設置操作,主要的變量如下:
int inHex:輸入進位的整型表示數,默認為10。
int outHex:輸出進位的整型表示數,默認為10。
String regex:用於過濾文本框中字符內容的正則表達式。默認為"[0-9]+"。
1.輸入進位滑杆(JSlider in):設置正確的屬性以及顯示位置。該組件還應該添加變動監聽(ChangeListener)。在監聽中應保持inHex和滑杆in的值一致。此外還應該更新正則表達式regex的內容。並處理左側標籤JLabel中的內容(界面圖形中,滑杆左側的JLabel標籤內容)。
2.輸出進位滑杆(JSlider out):同上。不同之處在於,監聽中應保持outHex和滑杆out的值是一致的。當輸出滑杆調節後,還需要更新左側標籤JLabel中的內容。
3.輸入文本框(JTextField input):設置正確的屬性以及顯示位置。該組件應該對其Document對象進行文檔監聽(DocumentListener),處理insertUpdate監聽內容,監聽的內容有兩部分:
當添加後的文本內容不符合regex的驗證時,刪除新增的內容,保持原有文本內容(需要額外注意一點,DocumentListener中在當前線程中使用Document處理文檔時會出現異常,需要使用EDT線程進行處理)。當文本內容符合正則表達式驗證要求時,將文本框內的信息進行進位轉化處理,並將轉化的結果在對應的JLabel標籤中輸出。程序實現源碼程序源碼下載地址:
https://gitee.com/brewerJava/JavaLearn/tree/master/Convert/src/edu
運行及使用效果圖如下:
上述示例中,我們只進行了最簡單的功能實現,目前無法輸入負數並進行轉化。如果需要增加負數轉換等相關功能,可以在此基礎上進行改造。
這個項目的目的是練習Swing組件,以及EDT線程和工作線程的使用。