mar*_*lon 5 c++ string bit-manipulation bitwise-operators
bool check(const char *text) {
char c;
while (c = *text++) {
if ((c & 0x80) && ((*text) & 0x80)) {
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
0x80整个神秘功能是什么以及有什么作用?
Adr*_*ica 12
测试表达式的结果x & 0x80是否为非零(如您所示的代码中执行的两次),检查操作数char( x) 的最高有效位(位 7)是否设置为1。在您的情况下,代码循环遍历给定的字符串,查找设置了该位的两个连续字符(c,它是“当前”字符的副本,以及*test,下一个字符)。
如果找到这样的组合,则该函数返回true;如果没有找到并且循环到达nul终止符(使c = *text++表达式变为零),则返回false。
至于为什么它会进行这样的检查 \xe2\x80\x93 我只能猜测,但是,如果设置了较高位,那么该字符将不是标准 ASCII 值(并且可能是 Unicode 对中的第一个,或者某些其他多字节字符表示)。
\n可能有用的参考资料:
\n\n1请注意,此按位 AND 测试实际上是检查该位的唯一安全char方法,因为 C++ 标准允许类型为signed(其中测试负值将是替代方法)或unsigned(其中测试 >= 128 将是必需的); 如果实现的char签名类型“错误”,则这些测试中的任何一个都会失败。
重写得不那么紧凑:
while (true)
{
char c = *text;
text += 1;
if (c == '\0') // at the end of string?
return false;
int temp1 = c & 0x80; // test MSB of c
int temp2 = (*text) & 0x80; // test MSB of next character
if (temp1 != 0 && temp2 != 0) // if both set the return true
return true;
}
Run Code Online (Sandbox Code Playgroud)
MSB 表示最高有效位。位7。纯 ASCII 字符为零