簡體   English   中英

小寫到大寫

[英]Lower case to upper case

如何使用位掩碼將小寫ASCII字符轉換為大寫(不允許-32)?

我不是要求解決我的作業,只是提示。

謝謝

當你說“(不允許-32)”時,我想你知道小寫字符和大寫字符之間的區別是32.現在將32轉換為它的二進制表示,只有一個位設置。 之后,找出一種使用位掩碼來切換位的方法。

考慮大小寫(0x20)之間的差異,然后將適當的掩碼應用於您的值

異或從上部或上部降低

對於實際代碼,您應該是庫函數,例如toupper()或towupper(),或者能夠處理Unicode復雜性的東西。

只需將+-32轉換為位操作即可。 32可以寫成2^x

此示例假定字符串是ASCII,並使用英文字母。

這是C99 C代碼,您應該在編譯時使用正確的編譯器標志來設置它。 我特意嘗試不使用本例中的任何庫,標准與否,因為我猜你還在學習C編程的基礎知識。

#define UPPER_CASE_SWITCH 0x5f
void makeUpper(unsigned char *string, int length)
{
    for(char c; length != 0 && (c=*string) != 0; --length) 
        *string++ = (((c >= 'a' && c <= 'z')) ? (c & UPPER_CASE_SWITCH) : c);
}

它利用了以下事實:ASCII表中的大寫和小寫字符之間的唯一差異是單個位。 特別是第6位(從右邊開始)。我們所要做的就是創建一個“掩碼”,其中包含除第6位(右起)之外的所有1,然后使用二進制AND指令(&)將此掩碼應用於我們的性格。 然后當然把它放到我們的字符串中。

這是一個python示例。

>>> bin(ord("a")) ## Gets the binary digit for the letter "a"
'0b1100001'
>>> bin(ord("A")) ## Gets the binary digit for the letter "A"
'0b1000001'
>>> hex(0b1011111) ## Gets the hexadecimal mask we are using in the C source
'0x5f'

在我看來,這是在c中制作ASCII字符串(或單個ASCII字符)大寫的最佳方法。 當然,除非你想要一些會返回一個新字符串的東西,即你想要創建一個“舊”字符串的大寫版本,但仍然能夠將原始版本保留在某處。 如果您理解我的第一個例子,這應該不會太難。 您只需分配一個新數組來放入大寫字符串,並返回指向此數組的指針(unsigned char *)。

將小寫ASCII字符的十六進制值與大寫ASCII字符進行比較,解決方案應該變得清晰。 如果解決方案不是很明顯,那么比較二進制值也可能有幫助。

從一個小拉丁字母的ASCII碼中減去32的操作將第5位從1翻轉到0。

在您指定時,您的作業沒有明確定義。 C標准對源或執行字符集的特定編碼一無所知,特別是它不假設任何接近ASCII的東西。

所以wnoise是對的,處理這些事情的唯一標准方法是為這種效果提供的預定義函數和宏。

嘗試使用0xDF(十六進制)或011011111二進制

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM