C# 字面值 二進(jìn)制字面值與數(shù)字分隔符
無(wú)論編程語(yǔ)法有多復(fù)雜,計(jì)算機(jī)都只能以兩種狀態(tài)——0和1來(lái)工作,這就是人們所熟知的二進(jìn)制(基數(shù)為 2)。如果愿意,可以將所有的程序都編碼為由1和0組成的序列,之后再運(yùn)行程序。雖然這種方式既不實(shí)用也 不值得推薦,但這樣做可以將減輕解釋器的負(fù)擔(dān),讓解釋器不用再?gòu)腃#、十進(jìn)制(基數(shù)為10)、八進(jìn)制(基數(shù)為 8)或十六進(jìn)制(基數(shù)為16)等對(duì)程序進(jìn)行轉(zhuǎn)換。這樣做并沒(méi)有多大好處,所以必須認(rèn)識(shí)到只有在非常特殊的情況 下才會(huì)用到二進(jìn)制表示法。例如,可能需要以二進(jìn)制、十六進(jìn)制或ASCII碼的形式將一些值傳遞給第三方的代 碼包。大部分情況下,除非確實(shí)需要二進(jìn)制字面值,否則還是應(yīng)該使用C#等編程語(yǔ)言來(lái)編寫代碼。
深入理解了有關(guān)半字節(jié)、位、字節(jié)、字符、字、二進(jìn)制、八進(jìn)制、十六進(jìn)制等字面值的技術(shù)知識(shí)和歷史背 景,才能夠深入理解何時(shí)、在什么地方、如何以及為什么使用這些字面值。我們不會(huì)深入探討“為什么使用” 這個(gè)歷史問(wèn)題,也不會(huì)深入探討“如何使用”這個(gè)專業(yè)問(wèn)題?,F(xiàn)在明白下面這樣的問(wèn)題就己經(jīng)足夠,例如,可 以將二進(jìn)制字面值作為一種優(yōu)雅方法,在進(jìn)行模式匹配和比較時(shí)將值存儲(chǔ)為常量,還可以用來(lái)實(shí)現(xiàn)位掩碼。如 下面代碼行中對(duì)二進(jìn)制和十六進(jìn)制所做的對(duì)比所示,可以發(fā)現(xiàn),二進(jìn)制數(shù)字從右往左循環(huán)移動(dòng)一位。十六進(jìn)制 值不存在模式,所以很難快速確定代碼的意圖。
int[] binaryPhases = [ ObOOllOOOl, ObOllOOOlO, ObllOOOlOO, OblOOOlOOl ];
int[] hexPhases = [ 0x31, 0x62/ 0xC4, 0x89 ];
為了更好地理解C# 7的二進(jìn)制字面值,以下面的代碼為例:
int[] numbers = [ lf 2, 4, 8, 16 ];
在C#7中,可以直接以二進(jìn)制的形式向numbers數(shù)組添加值,如下所示:
int[] numbers = [ ObOOOl, ObOOlO, ObOOlOO, ObOOOlOOO, ObOOOlOOOO ];
正如十六進(jìn)制值以前綴OX表示,編譯器會(huì)將以O(shè)b開頭的任何值都識(shí)別為二進(jìn)制值,并按照二進(jìn)制值進(jìn)行 處理。能夠想到,較大數(shù)的二進(jìn)制值會(huì)非常長(zhǎng),當(dāng)手動(dòng)輸入時(shí)特別容易犯錯(cuò)。例如數(shù)字128的二進(jìn)制值為 10000000——即1后面要跟7個(gè)0。對(duì)于這種情況,C#7中的新特性數(shù)字分隔符就可以派上用場(chǎng)。例如,下面 的代碼:
int(] numbers = [ 32, 64, 128 ];
int[] numbers = [ ObOOlO一0000, 0b0100_0000f 0bl000_0000 ];
可以看出,將二進(jìn)制字面值分隔成數(shù)字組有助于増強(qiáng)代碼的可讀性,便于代碼的管理。數(shù)字分隔符不只適 用于二進(jìn)制值,也可以用于十進(jìn)制、浮點(diǎn)數(shù)和雙精度數(shù)。下面的代碼在表示Pi的值時(shí),每三位使用了一個(gè)分隔 符。使用數(shù)字分隔符的主要目的就是使代碼更易讀。
public const double Pi = 3.141_592_653_589_793_238_462_643_383_279_502;
點(diǎn)擊加載更多評(píng)論>>