这是问题所在:
在C(&和< =)中仅使用两个操作,最多5个操作,确定字符是字母小写还是大写。您可以根据需要声明任意数量的变量,但是您只能进行5次按位和(&)操作以及< =比较。
示例:
is_char('b') = 1
is_char('A') = 1
is_char(10) = 0
我可以在6个操作中完成,但不能在5个操作中完成....任何人都有想法?
对不起!!忘了包括没有人可以使用控制流语句:/
答案 0 :(得分:5)
以下是如何使用五个操作而不是控制流语句。我们通过丢弃0x20位(将a-z
范围映射到A-Z
范围)来避免第二次范围测试:
int is_char(unsigned char c) {
return ((c & ~0x20) <= 'Z') & ('A' <= (c & ~0x20))
}
请注意,如果您不希望~0x20
意外地被视为操作员,则可以将0xdf
编码为~
。
修改c
会将此操作减少到四个操作,但优化程序应该看到冗余:
int is_char(unsigned char c) {
c &= ~0x20;
return ('A' <= c) & (c <= 'Z');
}
答案 1 :(得分:1)
Gabe你忘记了在C中,char表示为ASCII表中的int。所以这可以在两个操作中完成。 (我认为OP没有详细说明这个问题)
if (c <= 'A' - 1)
return 0;
if ('z' + 1 <= c)
return 0;
return 1;
答案 2 :(得分: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
仅用于说明 - 将其转换为常量留给读者。