亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解析C#中不一樣的大小寫轉(zhuǎn)換

 更新時間:2013年05月13日 14:55:57   作者:  
本篇文章是對C#中大小寫轉(zhuǎn)換的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

假設(shè)有一個string “BaSiC”,需要將它轉(zhuǎn)變?yōu)榇笮懀敲丛撊绾无D(zhuǎn)換?

最簡單的方式:調(diào)用api

string str = "BaSiC";

string strUpper = str.ToUpper();

string strLower = str.ToLower();

第二種方法:調(diào)用Char.ToUpper(),Char.ToLower()方法,同樣是調(diào)用api

第三種方法:使用for循環(huán)來判斷,如果是大寫就,如果是小寫就..

首先觀察大寫字母和小寫字母的異同:

image

打印上面的代碼如下,有興趣的可以自己試試打印這樣的表格出來:

Console.WriteLine("{0,-3} | {1,-6} | {2,-8} | {3,-3} | {4,-6} | {5,-8}",

    "小寫", "ascil", "2進(jìn)制", "大寫", "ascil", "2進(jìn)制");

IEnumerable<char> chars = Enumerable.Range('a', 'z' - 'a' + 1).Select(i => (char)i);

foreach (char c in chars)

{

    char upperC = char.ToUpper(c);

    Console.WriteLine("{0,-5} | {1,-6} | {2,-10} | {3,-5} | {4,-6} | {5,-10}",

        c, (int)c, Convert.ToString(c, 2),

        upperC, (int)upperC, Convert.ToString(upperC, 2));

}

從上面很容易看的出來'a' 比大寫的'A' 的ascil多32,從這點(diǎn)出發(fā)就可以得到下面的代碼:

private static char[] GetUpperChars(string str)

{

    char[] chars = str.ToCharArray();

    for (int i = 0; i < chars.Length; i++)

    {

        if (char.IsLower(chars[i]))

        {

            chars[i] = (char)(chars[i] - 32);

        }

    }

    return chars;

}

這段代碼使用for循環(huán)并加入判斷,如果是小寫,則將其值減去32,調(diào)用也比較簡單:

string strUpper2 = new string(GetUpperChars(str));

這段代碼唯一的缺點(diǎn)是進(jìn)行了IsLower的判斷,可不可以在沒有判斷的情況下來修改chars使其變成大寫呢?

如果從Ascii 的角度來解決這個問題,那么我們就必須使用大小寫的判斷,我在匯編語言的書上看到了這句話:

如果一個問題的解決方案,使我們陷入一種矛盾之中,那么很可能是我們考慮問題的出發(fā)點(diǎn)有了問題,或者說我們起初運(yùn)用的規(guī)律并不適合。

這段話的意思是,可能我們應(yīng)該從其他角度來觀察,而不應(yīng)該從Ascii的角度來觀察。

如果不從Ascii的角度來觀察,那還能從哪里來觀察呢?

可以從2進(jìn)制的角度來觀察。

image

還是這幅圖,只是我們的觀察角度變成了2進(jìn)制。

a 2進(jìn)制:1100001, b2進(jìn)制1100010,..

A 2進(jìn)制: 1000001, B2進(jìn)制1000010..

可以知道a的第5位是1,而A的第5位是0,(從右邊往左邊數(shù),0開始,后面得第幾位都這樣數(shù))

        b的第5位是1,而B的第5位是0,

        ..

所以如果要將一個字符串變成大寫,只需要將字符串的所有字符的第5位全部變成1就可以了。

而如何將一個字符的第5位變成1呢?

答案是使用And(位運(yùn)算)操作.

首先a 是個7位字符,只所以是7位,是因為在制定Ascii的時候位比較貴,8位比較浪費(fèi),而6位又不夠,所以ascii碼是7位的,這點(diǎn)從

a 1100001 就可以看出了,總共7位。

它可以和0101-1111 或者是1101-1111,進(jìn)行And

C#And &

所以你可能會將函數(shù)修改為:

for (int i = 0; i < chars.Length; i++)

{

    chars[i] = (char)(chars[i] & 11011111);

}

先停一下,你認(rèn)為上面的寫法正確嗎?

然后運(yùn)行,結(jié)果卻發(fā)現(xiàn):

image

 

為什么?

這是因為C#中的& 默認(rèn)操作的是十進(jìn)制的數(shù)字,所以11011111,

就會變成一千一百零一萬一千一百一十一

所以要將2進(jìn)制的11011111 變成10進(jìn)制,如何轉(zhuǎn)變?

int value = Convert.ToInt32("11011111", 2);

value的值是223.所以代碼修改為:

for (int i = 0; i < chars.Length; i++)

{

    chars[i] = (char)(chars[i] & 223);

}

運(yùn)行可以得到正確的結(jié)果:

或者使用16進(jìn)制來表示:1101-1111 ,16進(jìn)制是:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

0 1 2 3 4 5 6 7 8 9  A  B  C   D  E  F

1101=2^3+2^2+1=8+4+1=13 = D

1111=2^3+2^2+2^1+2^0=8+4+2+1=15 = F

所以可以將上面的代碼修改為:

chars[i] = (char)(chars[i] & 0xdf);

同樣因為只是第5位不同,而第7位會被忽略。所以和 0101-1111進(jìn)行and操作也可以得到正確的答案:

0101-1111 16進(jìn)制是0x5f.所以代碼可以變成:

chars[i] = (char)(chars[i] & 0x5f);

相關(guān)文章

  • C++ STL 四種智能指針的用法詳解

    C++ STL 四種智能指針的用法詳解

    C++ 標(biāo)準(zhǔn)模板庫 STL(Standard Template Library) 一共給我們提供了四種智能指針:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,今天給大家詳細(xì)介紹這幾種指針的具體用法,需要的朋友參考下吧
    2021-06-06
  • C++編程中break語句和continue語句的學(xué)習(xí)教程

    C++編程中break語句和continue語句的學(xué)習(xí)教程

    這篇文章主要介紹了C++編程中break語句和continue語句的學(xué)習(xí)教程,break和continue是C++循環(huán)控制中的基礎(chǔ)語句,需要的朋友可以參考下
    2016-01-01
  • C語言返回值指針的函數(shù)詳解

    C語言返回值指針的函數(shù)詳解

    這篇文章主要為大家詳細(xì)介紹了C語言返回值指針的函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++設(shè)計模式之橋接模式

    C++設(shè)計模式之橋接模式

    這篇文章主要介紹了C++設(shè)計模式之橋接模式,本文講解了什么是橋接模式、為什么要使用橋接模式、什么時候使用橋接模式等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • C語言實(shí)現(xiàn)班級成績管理系統(tǒng)

    C語言實(shí)現(xiàn)班級成績管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)班級成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言實(shí)現(xiàn)動態(tài)鏈表的示例代碼

    C語言實(shí)現(xiàn)動態(tài)鏈表的示例代碼

    本文主要介紹了C語言實(shí)現(xiàn)動態(tài)鏈表的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 基于c++計算矩形重疊面積代碼實(shí)例

    基于c++計算矩形重疊面積代碼實(shí)例

    這篇文章主要介紹了基于c++計算矩形重疊面積代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • C++排序算法之插入排序

    C++排序算法之插入排序

    這篇文章主要為大家詳細(xì)介紹了C++排序算法之插入排序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 基于VC中使用ForceInclude來強(qiáng)制包含stdafx.h的解決方法

    基于VC中使用ForceInclude來強(qiáng)制包含stdafx.h的解決方法

    本篇文章是對VC中使用ForceInclude來強(qiáng)制包含stdafx.h的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 利用OpenCV實(shí)現(xiàn)局部動態(tài)閾值分割

    利用OpenCV實(shí)現(xiàn)局部動態(tài)閾值分割

    這篇文章主要為大家詳細(xì)介紹了利用OpenCV實(shí)現(xiàn)局部動態(tài)閾值分割,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論