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

时间:2015-03-18 04:49:25

标签: c++ gray-code

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

它也毫无意义。推测的问题是m可以有比char(真)更多的位,以便"不必要"比特被掩盖了。

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

相关问题