如何判断两个8位字符是C++中的格雷码? 问题是,如果在C++中只有1位,那么两个8位字符是否是灰色码? 我找到了一个优雅的C++解决方案: bool isGray(char a, char b) { int m = a ^ b; return m != 0 && (m & (m - 1) & 0xff) == 0; }

如何判断两个8位字符是C++中的格雷码? 问题是,如果在C++中只有1位,那么两个8位字符是否是灰色码? 我找到了一个优雅的C++解决方案: bool isGray(char a, char b) { int m = a ^ b; return m != 0 && (m & (m - 1) & 0xff) == 0; },c++,gray-code,C++,Gray Code,我很困惑&0xff的作用是什么?&0xff从结果值中提取8个最低位,忽略任何较高的位。这是错误的。错误的想法是字符是8位的 这也是毫无意义的。假定的问题是m可以比char true有更多的位,因此不必要的位被屏蔽 但是m是符号扩展的。这意味着符号位被复制到较高的位。现在,当我们比较x==0时,我们检查所有位是否都为零,使用x&0xff,我们比较低8位是否为零。如果通过符号扩展将x的第8位复制到所有更高的位置,那么无论复制的位是0还是1,这两个条件都是相同的。我们可以使用char m=a^b吗?当

我很困惑&0xff的作用是什么?

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

这是错误的。错误的想法是字符是8位的

这也是毫无意义的。假定的问题是m可以比char true有更多的位,因此不必要的位被屏蔽


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

我们可以使用char m=a^b吗?当然可以,但这有什么帮助?它将被转换回下一行表达式中的整数。是的,您回答了我的问题,谢谢!只是想知道为什么这段代码的作者选择int而不是char?看起来char只有8位,甚至不需要&0xffm你的意思是m在m-1时被转换回来?除非我疯了,只要返回m&m-1;会有用的。虽然底流技术上可能是UB,但你需要未签名的字符IIRC。而且UB不仅仅是技术上的UB,现代优化器会用它来证明m=0这种证明可能会对代码产生意想不到的影响。