C中的isalpha函数仅使用&和<=运算符

cla*_*dio -4 c bit-manipulation

这就是问题:

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

例:

is_char('b') = 1
is_char('A') = 1
is_char(10) = 0
Run Code Online (Sandbox Code Playgroud)

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

抱歉!!忘了包括没有人可以使用控制流语句:/

nne*_*neo 5

以下是如何使用五个操作而不是控制流语句.我们通过丢弃0x20位(将a-z范围映射到A-Z范围)来避免第二次范围测试:

int is_char(unsigned char c) {
    return ((c & ~0x20) <= 'Z') & ('A' <= (c & ~0x20))
}
Run Code Online (Sandbox Code Playgroud)

请注意,您可以编写代码~0x20,就0xdf好像您不希望~意外地考虑操作员一样.

c虽然优化器应该看到冗余,但修改会将此操作减少到四个操作:

int is_char(unsigned char c) {
    c &= ~0x20;
    return ('A' <= c) & (c <= 'Z');
}
Run Code Online (Sandbox Code Playgroud)