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个中完成....任何人都有想法?
抱歉!!忘了包括没有人可以使用控制流语句:/
以下是如何使用五个操作而不是控制流语句.我们通过丢弃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)