如何判断两个 8 位字符是否为 C++ 中的格雷码?

How to tell if two 8-bit chars are gray codes in c++?

问题是在C++中判断两个8位字符是否为格雷码(仅1位不同)? 我找到了一个优雅的 C++ 解决方案:

bool isGray(char a, char b) {
    int m = a ^ b;
    return m != 0 && (m & (m - 1) & 0xff) == 0;
}

我很困惑“& 0xff”是做什么的?

& 0xff 从结果值中提取最低 8 位,忽略任何较高位。

错了。错误的想法是char是8位。

这也是没有意义的。假定的问题是 m 的位数可能比 char 多(正确),因此 "unnecessary" 位被屏蔽掉了。

但是 m 是符号扩展的。这意味着符号位被复制到更高位。现在,当我们比较 x==0 时,我们正在检查是否所有位都为零,而对于 x & 0xff 我们正在比较低 8 位是否为零。如果 x 的第 8 位被复制到所有高位(通过符号扩展),那么无论复制的位是 0 还是 1,这两个条件都是相同的。