这就是问题:isalpha功能和<=运营商
在C(&和< =)仅使用两个操作,和最多5个的操作,确定字符是否是按字母顺序小写或大写。您可以根据需要声明尽可能多的变量,但限制为5次按位运算(&)和< =比较。
例如:
is_char('b') = 1
is_char('A') = 1
is_char(10) = 0
我能做到这一点的6个操作,但不能做到这一点在5 ....人有一个想法?
对不起!忘记包括没有人可以使用控制流程表:/
这就是问题:isalpha功能和<=运营商
在C(&和< =)仅使用两个操作,和最多5个的操作,确定字符是否是按字母顺序小写或大写。您可以根据需要声明尽可能多的变量,但限制为5次按位运算(&)和< =比较。
例如:
is_char('b') = 1
is_char('A') = 1
is_char(10) = 0
我能做到这一点的6个操作,但不能做到这一点在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');
}
非常好!掩盖案件,然后测试阻止我减少操作的数量。 – James
您是否必须使用&
运算符?如果没有,你可以用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
仅仅是为了说明 - 将其转换为一个常数作为练习留给读者。
你不能使用像下面这样的控制流程语句:/忘了补充那个对不起 – n00b
Gabe您忘记了在C中,char在ASCII表中被表示为int。所以这可以在两个操作中完成。 (我想对这个问题的任择议定书没有充分阐述不过)
if (c <= 'A' - 1)
return 0;
if ('z' + 1 <= c)
return 0;
return 1;
'Z'和'z'之间的字符如何:'5b [5c \ 5d] 5e^5f _ 60' – James
新用户提示:随意详细说明你的答案,特别是当你问及你考虑的是一个有主题的新手时,他/她可能会喜欢关于ascii表的更多解释,以及它是如何工作的,以及一些链接。 –
向我们展示你尝试过什么。 – Barmar
它取决于字符编码(并且UTF8字母可能以几个字节编码)。 –
这是假设字母有连续的代码吗? – chris