问题是要判断C ++中两个8位字符是否为格雷码(只有1位不同)? 我发现了一个优雅的C ++解决方案:
bool isGray(char a, char b) {
int m = a ^ b;
return m != 0 && (m & (m - 1) & 0xff) == 0;
}
我很困惑“& 0xff”会做什么?
答案 0 :(得分:0)
& 0xff
从结果值中提取8个最低位,忽略任何更高位。
答案 1 :(得分:0)
这是错的。错误的想法是char
是8位。
它也毫无意义。推测的问题是m
可以有比char
(真)更多的位,以便"不必要"比特被掩盖了。
但是m
是符号扩展的。这意味着符号位被复制到更高的位。现在,当我们比较x==0
时,我们要检查所有位是否为零,并且x & 0xff
我们要比较低8位是否为0。如果将x的第8位复制到所有较高位置(通过符号扩展),则无论复制的位是0还是1,这两个条件都是相同的。