小写到大写

时间:2010-11-02 15:31:47

标签: c character bit-manipulation

如何使用位掩码将小写ASCII字符转换为大写(不允许-32)?

我不是要求解决我的作业,只是一些提示。

由于

9 个答案:

答案 0 :(得分:14)

当您声明“(不允许-32)”时,我想您知道小写字符和大写字符之间的区别是32.现在将32转换为其二进制表示,只有一个位集。之后,找出一种方法来使用bit mask来切换位。

答案 1 :(得分:4)

考虑大小写(0x20)之间的差异,然后将适当的掩码应用于您的值

XOR从较低的上部或上部降低

答案 2 :(得分:3)

对于实际代码,您应该是库函数,例如toupper()或towupper(),或者能够处理Unicode复杂性的东西。

答案 3 :(得分:2)

只需将+-32转换为位操作即可。 32可以写为2^x

答案 4 :(得分:1)

此示例假定该字符串采用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指令(&amp;)来应用此掩码对我们的性格。然后当然把它放到我们的字符串中。

这是一个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 *)。

答案 5 :(得分:0)

将小写ASCII字符的十六进制值与大写ASCII字符进行比较,解决方案应该变得清晰。如果解决方案不是很明显,那么比较二进制值也可能会有所帮助。

答案 6 :(得分:0)

从一个小拉丁字母的ASCII码中减去32的操作将第5位从1翻转为0。

答案 7 :(得分:0)

正如您指定的那样,您的作业没有明确定义。 C标准对源或执行字符集的特定编码一无所知,特别是它不会假设任何接近ASCII的东西。

所以wnoise是对的,处理这些事情的唯一标准方法是为这种效果提供的预定义函数和宏。

答案 8 :(得分:-1)

尝试使用0xDF(十六进制)或011011111二进制