欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于C#轉(zhuǎn)換二進(jìn)制所引起的一些思考

 更新時(shí)間:2020年07月03日 08:51:28   作者:Jeffcky  
這篇文章主要給大家介紹了關(guān)于C#轉(zhuǎn)換二進(jìn)制所引起的一些思考,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近遇到很有意思轉(zhuǎn)換二進(jìn)制的問題,有部分童鞋儼然已了解,可能也有一部分童鞋沒碰到過也就不知情,這里我們來深入學(xué)習(xí)下轉(zhuǎn)換二進(jìn)制所帶來的問題。

二進(jìn)制轉(zhuǎn)換問題

假設(shè)現(xiàn)在我們有一個(gè)int類型的數(shù)據(jù),它的范圍區(qū)間暫且定在0-15之間,我們需要將其轉(zhuǎn)換為二進(jìn)制,然后獲取二進(jìn)制中的每一位,若不足4位則0填充。看似很簡單是不是,直接通過C#內(nèi)置APi即可達(dá)到此需求,如下:

var binary = Convert.ToString(7, 2).PadLeft(4, '0').ToArray();

上述將數(shù)字7轉(zhuǎn)換為包含二進(jìn)制位的字符串?dāng)?shù)組形式,7轉(zhuǎn)換二進(jìn)制然后不足4位以0填充即(0111),我們?nèi)缦芦@取二進(jìn)制位字符串?dāng)?shù)組為索引的位,結(jié)果應(yīng)該打印出0,對(duì)嗎?

var zerobit = binary[0];
Console.WriteLine(zerobit);

好像一點(diǎn)毛病也沒有,這是在控制臺(tái)中進(jìn)行打印,若是將該數(shù)據(jù)導(dǎo)出到Excel中,你會(huì)發(fā)現(xiàn)結(jié)果將可能是48或49而不是0或1(你可以一試)這是因?yàn)槿缦拢?/p>

我們通過調(diào)試可知實(shí)際上在字符0上還攜帶有48,這個(gè)48實(shí)際上是字符0的ASCII碼,字符1的ASCII碼是49,通過如下代碼即可證明:

foreach (var b in System.Text.Encoding.UTF8.GetBytes(binary))
{
 Console.WriteLine(b.ToString());
}

我們對(duì)將對(duì)應(yīng)字符數(shù)組索引數(shù)據(jù)進(jìn)行如下ToString轉(zhuǎn)換即可避免導(dǎo)出數(shù)據(jù)時(shí)可能出現(xiàn)的問題

var zerobit = binary[0];
Console.WriteLine(zerobit.ToString());

轉(zhuǎn)換字符數(shù)組問題

當(dāng)我們轉(zhuǎn)換為字符數(shù)組時(shí),有兩種方式,既可采用上述ToArray方法,也可以通過ToCharArray方法來實(shí)現(xiàn),如下,那么哪種方法會(huì)更好呢?

var binary = Convert.ToString(7, 2).PadLeft(4, '0').ToArray();

var binary1 = Convert.ToString(7, 2).PadLeft(4, '0').ToCharArray();

此時(shí)比較此二者方法的性能好壞,只能去看對(duì)應(yīng)源碼實(shí)現(xiàn),首先我們來看看ToCharArray方法,如下:

public unsafe char[] ToCharArray()
{
 if (Length == 0)
 {
  return Array.Empty<char>();
 }
 char[] array = new char[Length];
 fixed (char* smem = &_firstChar)
 {
  fixed (char* dmem = &array[0])
  {
   wstrcpy(dmem, smem, Length);
  }
 }
 return array;
}
internal unsafe static void wstrcpy(char* dmem, char* smem, int charCount)
{
 Buffer.Memmove((byte*)dmem, (byte*)smem, (uint)(charCount * 2));
}

上述對(duì)于ToCharArray代碼量還是不多,我們來看看ToArray方法實(shí)現(xiàn),如下:

public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
{
 if (source == null)
 {
  throw Error.ArgumentNull("source");
 }
 return new Buffer<TSource>(source).ToArray();
}

上述只是寫了一個(gè)擴(kuò)展方法,我們繼續(xù)往下看Buffer類的具體實(shí)現(xiàn),如下:

internal Buffer(IEnumerable<TElement> source)
{
 TElement[] array = null;
 int num = 0;
 ICollection<TElement> collection = source as ICollection<TElement>;
 if (collection != null)
 {
  num = collection.Count;
  if (num > 0)
  {
   array = new TElement[num];
   collection.CopyTo(array, 0);
  }
 }
 else
 {
  foreach (TElement item in source)
  {
   if (array == null)
   {
    array = new TElement[4];
   }
   else if (array.Length == num)
   {
    TElement[] array2 = new TElement[checked(num * 2)];
    Array.Copy(array, 0, array2, 0, num);
    array = array2;
   }
   array[num] = item;
   num++;
  }
 }
 items = array;
 count = num;
}

從代碼量上看就覺得ToArray方法實(shí)現(xiàn)稍微復(fù)雜一點(diǎn),所以我們選擇使用ToCharArray會(huì)更好,我要是如此草草結(jié)束此文,一定會(huì)噴。原歸正傳,我們一步步來分析,如上做了一點(diǎn)優(yōu)化,首先會(huì)判斷參數(shù)是否屬于集合接口,若是則直接通過復(fù)制轉(zhuǎn)換為數(shù)組形式,但是我們知道字符串肯定沒有實(shí)現(xiàn)ICollection<T>接口,所以走另外一個(gè)條件分支,但是有的童鞋可能就有疑問了,此時(shí)為何可以遍歷呢?那是因?yàn)獒槍?duì)字符實(shí)現(xiàn)了IEnumerable<char>接口,所以可以進(jìn)行遍歷,如下:

public sealed class CharEnumerator : IEnumerator, ICloneable, IEnumerator<char>, IDisposable
{......}

接下來則是初始化容量為4的數(shù)組,為何這里為4呢?這里我認(rèn)為應(yīng)該談不上優(yōu)化,與其說是實(shí)現(xiàn)者的一種拍腦袋的想法,我傾向于理解為是一種權(quán)衡或考量,既然轉(zhuǎn)到此分支說明一定是轉(zhuǎn)換為二進(jìn)制位的數(shù)組,比如上述進(jìn)行填充后長度剛好為4。再接下來無用我再多講,就是遍歷所有字符數(shù)組,將每一個(gè)字符串添加到數(shù)組中去,直到數(shù)組長度和變量值(num)相等最終進(jìn)行一次性復(fù)制,最終將數(shù)組賦值給數(shù)組元素以及將變量num賦值給數(shù)組元素的數(shù)量(count)。

好了,講解了這么多,那么問題來了,到底誰的性能會(huì)更好呢?ToCharArray方法實(shí)現(xiàn)底層采用指針操作轉(zhuǎn)化為字符數(shù)組,而利用ToArray方法由于string沒有實(shí)現(xiàn)ICollection<T>接口,也就是說根本不清楚字符串中字符數(shù)組的長度,所以只能采取低效遍歷的方式去進(jìn)行轉(zhuǎn)換,我們可認(rèn)為通過中間緩沖區(qū)的方式(即上述通過實(shí)例化數(shù)組作為橋梁最終進(jìn)行復(fù)制)實(shí)現(xiàn)。由此得出,在將字符串轉(zhuǎn)換為字符數(shù)組時(shí),一定要用ToCharArray方法而不是ToArray,ToCharArray性能優(yōu)于ToArray方法,我不禁在想,針對(duì)字符轉(zhuǎn)換為數(shù)組只提供ToCharArray方法不就好了么,為何還要提供ToArray方法,讓人容易產(chǎn)生誤會(huì),它的場景難道還有其他嗎?

總結(jié)

本文詳細(xì)講解了在轉(zhuǎn)換二進(jìn)制數(shù)據(jù)所引發(fā)的一點(diǎn)個(gè)人思考,在將字符串轉(zhuǎn)換為字符數(shù)組時(shí),通過方法名稱意思可能直接就用ToCharArray方法,但是又偏偏提供了字符串的ToArray方法,其本質(zhì)是針對(duì)字符數(shù)組的擴(kuò)展方法,如果對(duì)源碼不了解的話,根本就不清楚到底應(yīng)該用哪一個(gè),從性能角度講,ToCharArray方法優(yōu)于ToArray方法,至于最終用哪一個(gè),你說了算。

到此這篇關(guān)于關(guān)于C#轉(zhuǎn)換二進(jìn)制所引起的文章就介紹到這了,更多相關(guān)C#轉(zhuǎn)換二進(jìn)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • WPF利用TextBlock實(shí)現(xiàn)查找結(jié)果高亮顯示效果

    WPF利用TextBlock實(shí)現(xiàn)查找結(jié)果高亮顯示效果

    在應(yīng)用開發(fā)過程中,經(jīng)常遇到這樣的需求:通過關(guān)鍵字查找數(shù)據(jù),把帶有關(guān)鍵字的數(shù)據(jù)顯示出來,同時(shí)在結(jié)果中高亮顯示關(guān)鍵字,所以本文就來和大家介紹一下如何利用TextBlock實(shí)現(xiàn)查找結(jié)果高亮顯示效果吧
    2023-08-08
  • C#多線程處理多個(gè)隊(duì)列數(shù)據(jù)的方法

    C#多線程處理多個(gè)隊(duì)列數(shù)據(jù)的方法

    本文將結(jié)合實(shí)例代碼,介紹C#多線程處理多個(gè)隊(duì)列數(shù)據(jù)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • C# Winform實(shí)現(xiàn)捕獲窗體最小化、最大化、關(guān)閉按鈕事件的方法

    C# Winform實(shí)現(xiàn)捕獲窗體最小化、最大化、關(guān)閉按鈕事件的方法

    這篇文章主要介紹了C# Winform實(shí)現(xiàn)捕獲窗體最小化、最大化、關(guān)閉按鈕事件的方法,可通過重寫WndProc來實(shí)現(xiàn),需要的朋友可以參考下
    2014-08-08
  • 深入探討C#中的結(jié)構(gòu)struct

    深入探討C#中的結(jié)構(gòu)struct

    這篇文章詳細(xì)介紹了C#中的結(jié)構(gòu)struct,有需要的朋友可以參考一下
    2013-09-09
  • C#8 的模式匹配實(shí)現(xiàn)

    C#8 的模式匹配實(shí)現(xiàn)

    這篇文章主要介紹了C#8 的模式匹配實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • C# WebService發(fā)布以及IIS發(fā)布

    C# WebService發(fā)布以及IIS發(fā)布

    這篇文章主要介紹了C# WebService發(fā)布以及IIS發(fā)布的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-07-07
  • c#系列 list詳情

    c#系列 list詳情

    這篇文章主要介紹了c#系列 list,list 本質(zhì)是一個(gè)數(shù)組,。就跟我們操作系統(tǒng)一樣,提前申請(qǐng)內(nèi)存大小。所以我們程序一般都有一個(gè)申請(qǐng)內(nèi)存,實(shí)際使用內(nèi)存,內(nèi)存碎片這幾個(gè)概念,下面?zhèn)z看文章詳細(xì)內(nèi)容吧
    2021-10-10
  • Unity3D自定義創(chuàng)建圓錐體

    Unity3D自定義創(chuàng)建圓錐體

    這篇文章主要為大家詳細(xì)介紹了Unity3D自定義創(chuàng)建圓錐體,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • VS2019配置OpenCV4.1.0詳細(xì)教程與測試代碼(推薦)

    VS2019配置OpenCV4.1.0詳細(xì)教程與測試代碼(推薦)

    這篇文章主要介紹了VS2019配置OpenCV4.1.0詳細(xì)教程與測試代碼,本文通過截圖實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C#實(shí)現(xiàn)電腦麥克風(fēng)錄音

    C#實(shí)現(xiàn)電腦麥克風(fēng)錄音

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)電腦麥克風(fēng)錄音,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評(píng)論