C中的isalpha函数仅使用&和< =运营商

时间:2012-09-17 04:35:57

标签: c bit-manipulation

这是问题所在:

在C(&和< =)中仅使用两个操作,最多5个操作,确定字符是字母小写还是大写。您可以根据需要声明任意数量的变量,但是您只能进行5次按位和(&)操作以及< =比较。

示例:

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

我可以在6个操作中完成,但不能在5个操作中完成....任何人都有想法?

对不起!!忘了包括没有人可以使用控制流语句:/

3 个答案:

答案 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仅用于说明 - 将其转换为常量留给读者。