2012-09-17 43 views
-4

这就是问题:isalpha功能和<=运营商

在C(&和< =)仅使用两个操作,和最多5个的操作,确定字符是否是按字母顺序小写或大写。您可以根据需要声明尽可能多的变量,但限制为5次按位运算(&)和< =比较。

例如:

is_char('b') = 1 
is_char('A') = 1 
is_char(10) = 0 

我能做到这一点的6个操作,但不能做到这一点在5 ....人有一个想法?

对不起!忘记包括没有人可以使用控制流程表:/

+7

向我们展示你尝试过什么。 – Barmar

+0

它取决于字符编码(并且UTF8字母可能以几个字节编码)。 –

+0

这是假设字母有连续的代码吗? – chris

回答

5

下面介绍如何在有五个操作和没有控制流语句做到这一点。我们避免第二次测试范围内通过降低为0x20位(映射a-z范围到A-Z范围):

int is_char(unsigned char c) { 
    return ((c & ~0x20) <= 'Z') & ('A' <= (c & ~0x20)) 
} 

注意,您可以为0xdf代码~0x20如果你不想做~考虑意外操作。

声明另一个变量削减下来四个OPS:

int is_char(unsigned char c) { 
    unsigned char cap = c & 0xdf; 
    return ('A' <= cap) & (cap <= 'Z'); 
} 
+1

非常好!掩盖案件,然后测试阻止我减少操作的数量。 – James

0

您是否必须使用&运算符?如果没有,你可以用4个<=操作做到这一点:

if (c <= 'A' - 1) 
    return 0; 
if (c <= 'Z') 
    return 1; 
if (c <= 'a' - 1) 
    return 0; 
if (c <= 'z') 
    return 1; 
return 0; 

注:这是假定ASCII和使用'A' - 1仅仅是为了说明 - 将其转换为一个常数作为练习留给读者。

+0

你不能使用像下面这样的控制流程语句:/忘了补充那个对不起 – n00b

1

Gabe您忘记了在C中,char在ASCII表中被表示为int。所以这可以在两个操作中完成。 (我想对这个问题的任择议定书没有充分阐述不过)

if (c <= 'A' - 1) 
    return 0; 
if ('z' + 1 <= c) 
    return 0; 
return 1; 
+4

'Z'和'z'之间的字符如何:'5b [5c \ 5d] 5e^5f _ 60' – James

+1

新用户提示:随意详细说明你的答案,特别是当你问及你考虑的是一个有主题的新手时,他/她可能会喜欢关于ascii表的更多解释,以及它是如何工作的,以及一些链接。 –