Go語(yǔ)言實(shí)現(xiàn)二進(jìn)制與十進(jìn)制互轉(zhuǎn)的示例代碼
最近在備考軟考的軟件設(shè)計(jì)師考試,在學(xué)習(xí)過(guò)程遇到很多于計(jì)算機(jī)基礎(chǔ)計(jì)算相關(guān)的知識(shí)點(diǎn),正好最近在學(xué)Go語(yǔ)言,所以就把計(jì)算的方式用Go語(yǔ)言實(shí)現(xiàn)一下。
當(dāng)前還在學(xué)習(xí)過(guò)程中,如有問(wèn)題,歡迎大佬們指正
二進(jìn)制轉(zhuǎn)十進(jìn)制
/* 轉(zhuǎn)換規(guī)則: 11001 從末尾到開(kāi)頭,以2為底數(shù),從0開(kāi)始遞增為指數(shù) * 二進(jìn)制數(shù),然后將這些二進(jìn)制數(shù)相加即可得出10進(jìn)制數(shù) 11001 = 1 * 2^0 + 0 * 2^1 + 0 * 2^2 + 1 * 2^3 + 1 * 2^4 = 1 + 0 + 0 + 8 + 16 = 25 這個(gè)規(guī)則也適用于其他進(jìn)制轉(zhuǎn)換為十進(jìn)制,只需要把底數(shù)替換為相應(yīng)的進(jìn)制數(shù)即可,這種方法叫做 “按權(quán)展開(kāi)法" 注意: 二進(jìn)制數(shù)也有小數(shù)點(diǎn),區(qū)別是小數(shù)點(diǎn)左邊的指數(shù)為正數(shù),右邊的指數(shù)為負(fù)數(shù) 例如: 11.01 = 1 * 2^-2 + 0 * 2^-1 + 1 * 2^0 + 1 * 2^1 = 0.25 + 0 + 1 + 2 = 3.25 */ func binaryToDecimal(val string) string { // 獲取二進(jìn)制字符字符串 // 使用前可使用正則校驗(yàn) [0-1]|[0-1].[0-1] var text = val // 指數(shù) v1 var v1 float64 = 0 var len = len(text) // 查看是否包含小數(shù)點(diǎn) contains := strings.Contains(text, ".") if contains { index := strings.LastIndex(text, ".") if index == (len -1) { text = text[0 : len-1] } else { v3 :=len - index v3-- v1 = float64(0 - v3) } } fmt.Println(v1) // 結(jié)果 var result float64 for i := len -1; i >= 0; i-- { u := string(text[i]) if u == "." { continue } v2,error := strconv.ParseFloat(u, 64) if error != nil { fmt.Println("轉(zhuǎn)換失敗",error) } // 乘數(shù) pow := math.Pow(2, v1) // 數(shù)值累加 result = result + (v2 * pow) // 指數(shù)遞增 v1++ } // 這里有個(gè)BUG,未判斷得出的十進(jìn)制數(shù)小數(shù)點(diǎn)后面有幾位小數(shù) return strconv.FormatInt(int64(result), 10) }
十進(jìn)制轉(zhuǎn)二進(jìn)制
/* 十進(jìn)制轉(zhuǎn) 二進(jìn)制的方法 十進(jìn)制數(shù)除以2取余數(shù)法 */ func decimalToBinary(val string) string { number, err := strconv.ParseInt(val, 10, 64) if err != nil { fmt.Println("數(shù)字轉(zhuǎn)換失敗",err) return "" } // 查看數(shù)字是否是負(fù)數(shù) var bool = number < 0 if bool { number = 0 -number } var result = "" for true { if number == 1 { result = fmt.Sprint(result,number) break } //// 除數(shù) var v1 = number / 2 //// 余數(shù) var v2 = number % 2 // 取余數(shù),拼接二進(jìn)制數(shù) result = fmt.Sprint(result,v2) number = v1 } // 反轉(zhuǎn)字符串 var finalResult = "" var len = len(result) for i := len - 1; i >= 0; i-- { finalResult = fmt.Sprint(finalResult,string(result[i])) } // 如果是負(fù)數(shù),則增加符號(hào) if bool { finalResult = fmt.Sprint("-",finalResult) } return finalResult }
總結(jié)
- R進(jìn)制轉(zhuǎn)十進(jìn)制數(shù)的方法叫做按權(quán)展開(kāi)法,這個(gè)權(quán)指的是指數(shù)
- 指數(shù)在小數(shù)點(diǎn)右邊為負(fù)數(shù),左邊為正數(shù) 例如 二進(jìn)制數(shù) "1110.01" 的指數(shù)依次為 -2 -1 0 1 2 3
到此這篇關(guān)于Go語(yǔ)言實(shí)現(xiàn)二進(jìn)制與十進(jìn)制互轉(zhuǎn)的示例代碼的文章就介紹到這了,更多相關(guān)Go語(yǔ)言二進(jìn)制與十進(jìn)制互轉(zhuǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang實(shí)現(xiàn)微信支付v3版本的方法
這篇文章主要介紹了golang實(shí)現(xiàn)微信支付v3版本的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03分析Go語(yǔ)言中CSP并發(fā)模型與Goroutine的基本使用
我們都知道并發(fā)是提升資源利用率最基礎(chǔ)的手段,尤其是當(dāng)今大數(shù)據(jù)時(shí)代,流量對(duì)于一家互聯(lián)網(wǎng)企業(yè)的重要性不言而喻。串流顯然是不行的,尤其是對(duì)于web后端這種流量的直接載體。并發(fā)是一定的,問(wèn)題在于怎么執(zhí)行并發(fā)。常見(jiàn)的并發(fā)方式有三種,分別是多進(jìn)程、多線程和協(xié)程2021-06-06使用Go語(yǔ)言實(shí)現(xiàn)Yaml編碼和解碼的方法詳解
在這篇文章中,我們將介紹如何使用Go語(yǔ)言編寫(xiě)代碼來(lái)實(shí)現(xiàn)Yaml編碼和解碼,文中有詳細(xì)的代碼示例供大家參考,對(duì)大家的學(xué)習(xí)和工作有一定的幫助,需要的朋友可以參考下2023-11-11golang使用sync.Once實(shí)現(xiàn)懶加載的用法和坑點(diǎn)詳解
這篇文章主要為大家詳細(xì)介紹了golang使用sync.Once實(shí)現(xiàn)懶加載的用法和坑點(diǎn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11go語(yǔ)法入門(mén)any類(lèi)型的使用場(chǎng)景示例詳解
這篇文章主要為大家介紹了go語(yǔ)法入門(mén)any類(lèi)型的使用場(chǎng)景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Golang Http請(qǐng)求返回結(jié)果處理
本文主要介紹了Golang Http請(qǐng)求返回結(jié)果處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Go語(yǔ)言斷言和類(lèi)型查詢的實(shí)現(xiàn)
Go語(yǔ)言變量類(lèi)型包含基礎(chǔ)類(lèi)型和復(fù)合類(lèi)型,類(lèi)型斷言一般是對(duì)基礎(chǔ)類(lèi)型的處理,本文主要介紹了Go語(yǔ)言斷言和類(lèi)型查詢的實(shí)現(xiàn),感興趣的可以了解一下2024-01-01