如何判断两个 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,这两个条件都是相同的。
问题是在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,这两个条件都是相同的。