使用Swing製作進位轉化器

2020-12-22 程序釀造師
進位轉化

1.各進位之間的轉化

在計算機科學中,常用的進位有二進位、八進位、十進位和十六進位。在開發過程中使用比較多的是二進位和十進位的。如果涉及一些字節編碼操作,十六進位也會用得到,甚至可能會用到三十二進位。

1.1 十進位向其它進位轉化

以正常的十進位數為標準,如果將一個十進位數轉化成二進位數。可以使用除法取餘的方式進行,在下圖中我們用二進位和八進位進行舉例:

十進位轉化成二進位、八進位

上圖所描述的是一個正整數轉化成各進位的算法描述。如果被轉化數是負數,需要經過三步轉化:1.先計算出其正整數的二進位碼。2.再計算其反碼。3.再計算補碼。以-5為例子,計算的二進位如下圖所示:

-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

運行及使用效果圖如下:

效果1(輸入、輸出均為10進位)
效果2(輸入10進位、輸出均為15進位)
效果3(輸入5進位、輸出均為16進位)

上述示例中,我們只進行了最簡單的功能實現,目前無法輸入負數並進行轉化。如果需要增加負數轉換等相關功能,可以在此基礎上進行改造。

這個項目的目的是練習Swing組件,以及EDT線程和工作線程的使用。

相關焦點

  • 16進位顏色表示與RGB色彩模型——零基礎自學網頁製作
    第一個括號中的"1"就是16,就好像10進位中,"10"中的"1"是10一樣的道理。但是我們沒有這樣的計數器,我們顯示數字都是0123這樣顯示,不會使用()來代表"個位、十位、百位......"的概念。因此,數學家為了方便顯示,對16進位9以後的數字約定好使用英文字母表示。
  • 大話二進位,八進位,十進位,十六進位之間的轉換
    當前的計算機系統使用的基本上是二進位系統,數據在計算機中主要是以補碼的形式存儲的。計算機中的二進位則是一個非常微小的開關,用「開」來表示1,「關」來表示0。因此十進位的2456轉換為八進位結果為4630。二進位到八進位轉換 7=4+2+1 111 八進位最大的數字是7轉換成二進位剛好是111,佔3個位每三個二進位數為一組,轉成一個八進位數位,如果二進位高位不足3位時,用零填補。
  • C/C+編程筆記:C語言進位詳解,二進位、八進位和十六進位!
    我們平時使用的數字都是由 0~9 共十個數字組成的,例如 1、9、10、297、952 等,一個數字最多能表示九,如果要表示十、十一、二十九、一百等,就需要多個數字組合起來。
  • 單片機進位轉換
    今天我就給大家講講與計算機有關的「進位轉換」問題。   我們以(25.625)(十)為例講解一下進位之間的轉化問題。 1. 十 > 二  給你一個十進位,比如:6,如果將它轉換成二進位數呢?十 ----> 八  10進位數轉換成8進位的方法,和轉換為2進位的方法類似,惟一變化:除數由2變成8。   來看一個例子,如何將十進位數120轉換成八進位數。
  • 二進位小總結
    計算機中通過高低電平表示1或者0,這樣就可以表示一個二進位的數值。一個1或者0表示的數值位稱為一個bit,而計算機中存儲和傳輸數據的最小單位是一個字節(byte)也就是8個bit,所以說計算機所有計算本質上都是基於二進位。在計算機中,我們可以使用1個或者多個字節存儲一個數,但無論是多少個字節,其大小肯定是固定的,同時其所能表示的數值的範圍也是固定的。
  • C語言常用的進位轉換工具函數盤點!爺爺再也不用擔心我不會進位...
    01 字符串轉十六進位 代碼實現: 03 字符串轉十進位 (1)若帶負號,代碼實現:
  • 問1得10:shell十進位轉換到任意進位,多大事兒,一行搞定!
    引言引言Bash編程中,我們一般不需要把字符串格式化為十六進位。因為,十進位是給人類看的,而16進位則用於存儲到計算機。本文通過編程實踐中所遇到的困難,引出進位轉換的問題。然後給出解決方案。其中,格式化字符串,所用的元字符非常有用。
  • Linux 上最好的十六進位編輯器 | Linux 中國
    1、Bless Hex Editorbless hex editor主要特點:Bless 是 Linux 上最流行的十六進位編輯器之一。你可以在應用中心或軟體中心中找到它。否則,你可以查看它們的 GitHub 頁面[2] 獲取構建和相關的說明。
  • 如何讓文科女朋友輕鬆認識二進位數?
    進位即進位制。進位制是一種計數方式,可以用有限的記數符號代表所有的數值。我們常用的進位包括:二進位、八進位、十進位與十六進位,它們之間區別在於數運算時是逢幾進一位。先來看看我們習慣使用的十進位,其實每個十進位數字都可以用10的連續冪方表示。
  • 現代二進位計算機,其原理到底是不是從八卦中引出的呢?
    二進位的計算方式也是其中之一。哈裡奧特在 1610 年開始進行一連串的「計算實驗」,用二進位、三進位、四進位、……等等不同方式做四則運算。在他的文稿中,就用 0 與 1 做為二進位的符號,並且演示一般十進位的數字如何轉換為二進位,以及如何進行加減乘除。
  • 小白基礎知識必備|整型常量與進位間的轉換
    ◎十進位整數十進位整數常量不需要在前面加前綴,十進位所包含數字0-9如:num = 12345;◎八進位常量常量前面加0作為前綴,八進位所包含數字是0 - 7之間如:num1 = 0127;◎十六進位常量常量前面加0x作為前綴,十六進位包含的數字0 - 9以及字母A-F,也可以小寫形式。
  • 經緯度十進位與六十進位轉換
    工作有時候經常要用到經緯度轉換這個功能,十進位與度分秒之間轉換如下:度分秒之間的關係式為1度=60分
  • 四級核心詞彙:swing,valid,champion,快來學學吧!
    嗨,大家好,今天為大家介紹三個單詞:swing,valid,champion,話不多說,讓我們開始吧!swing,valid,champion00:07來自梨梨學英語swingswing是個動詞,意思是「搖擺,擺動」,相當於單詞sway。
  • 嵌入式單片機基礎-十六進位,天生的輔助型英雄
    在生活中,絕大部分人喜歡用十進位;但是在處理器的心裡只有二進位。如果我們寫代碼想要配置某個寄存器,通過參考手冊直接得到一般都是和這個寄存器匹配的一組二進位序列。如果我們在代碼中把這個二進位序列以二進位的形式寫出來,那是相當麻煩的一件事情。
  • 為什麼時分秒的單位換算是六十進位,而不是十進位?跟角度有關聯
    十進位是人類最早掌握的,最廣泛使用的計數方法。現行的公制單位裡,長度、重量等採用的都是十進位(或者是10的整倍數)。那為什麼時、分、秒之間的換算,採用的是六十進位而不是十進位?時、分、秒是六十進位的,而角度的度量單位度、分、秒也使六十進位的,這之間沒有聯繫呢?答案當然是肯定的。古代人對於時間的測量是基於天文曆法和生活的需要。而在地球上,時間流逝最重要的特徵就是晝夜變化——即地球的自轉。
  • ...和選擇了「二進位」這個開啟人類社會數位化信息化大門的金鑰匙?
    例如:穿孔卡上「有孔」和「無孔」、磁路的「正向」和「反向」;電路的「開」和「關」都可以用來表示二進位的1和0。採用二進位可大大簡化計算機的設計,加快了人類社會數位化和信息化進程。因此,二進位可以看做是開啟了人類社會數位化和信息化大門的金鑰匙。提出和選擇使用二進位的歷史人物功不可沒。本文試圖探究二進位數位化和信息化的發展歷程,紀念那些對此做出卓越貢獻的先賢們。
  • 青少年AI測試考級系列之——你知道計算機採用的是什麼進位系統?
    所謂進位系統,就是一種計數的方式。人類創造了文字、阿拉伯數字,進而設定了十進位的計數方式,才不斷演變至今,有了我們的現代文明以及數字科技時代。人類採用的是十進位的計數系統,想想為什麼呢?文末揭曉答案計算機採用的是二進位的計數系統。除此之外,計算機中還有八進位、十六進位計數系統。在現實生活中,也有類似其他的計數方式在被使用。比如:兩個數為計數單元:一雙鞋、一雙襪子、一雙手套等等。十二個數為計數單元:一打啤酒(12瓶)、一打飲料。
  • 大跌眼鏡:python print竟然不能輸出二進位內容
    前幾天收到一個朋友的私信,他使用python開發cgi程序(這個方向實在是比較冷門),在讀取png文件並輸出的時候,遇到了讓人無法理解的兩個bug,小編花了一上午的時間,各種查資料,終於幫他解決了問題。朋友們若是有程序方面的問題也可以私信小編的哦,小編有空的時候一定會幫忙解決的。
  • 21歲理工男開源的十六進位編輯器爆贊
    開源最前線(ID:OpenSourceTop) 猿妹整編綜合自:https://github.com/WerWolv/ImHex十六進位編輯器,用來以16進位視圖進行文本編輯的編輯工具軟體。十六進位編輯器可以用來檢查和修復各種文件、恢復刪除文件、硬碟損壞造成的數據丟失等。它一直是計算機專業人員非常喜歡的工具。如果你有一份遊戲的配置文件,則可以使用十六進位編輯器將其打開,並通過它更改某些值從而獲得更多的彈藥/得分等,深受程式設計師喜歡的十六進位編輯器有很多,諸如Bless Hex編輯器、Okteta編輯器等。
  • 圖解css表示顏色的4種方式:顏色名稱、十六進位值、rgb和hsl函數
    所以,我們需要一種表示方法來表示我們要使用哪一種顏色。今天我們就來講解一下css中4種基本的表示顏色的方式,它們分別是:顏色的英文名稱、十六進位顏色值、rgb顏色函數和hsl顏色函數。1.顏色的英文名稱css已經預定義好了一百多種常見顏色的英文名稱,我們可以直接使用它們。比如,red(紅色)、purple(紫色)、yellow(黃色)等等。而且這些名稱是不區分大小寫的,比如RED、rED、Red等都相當於red。使用顏色名稱非常直觀明了,這是最簡單、最直接的顏色表示方式。