-4

这就是问题:

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

例子:

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

我可以在 6 次操作中完成,但不能在 5 次中完成......有人有想法吗?

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

4

3 回答 3

5

这是使用五个操作且没有控制流语句的方法。a-z我们通过删除 0x20 位(将范围映射到范围)来避免第二次范围测试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');
}
于 2012-09-17T06:17:12.037 回答
1

Gabe 您忘记了在 C 中,char 在 ASCII 表中表示为 int。所以这可以通过两个操作来完成。(我认为 OP 并没有完全详细说明这个问题)

if (c <= 'A' - 1)
    return 0;
if ('z' + 1 <= c)
    return 0;
return 1;
于 2012-09-17T04:51:58.153 回答
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只是为了说明 - 将其转换为常量留给读者作为练习。

于 2012-09-17T04:45:01.727 回答