Как определить, являются ли два 8-битных символа серым кодом в C++?
Проблема состоит в том, чтобы определить, являются ли два 8-битных символа серыми (отличаются только на 1 бит) в C++? Я нашел элегантное решение C++:
bool isGray(char a, char b) {
int m = a ^ b;
return m != 0 && (m & (m - 1) & 0xff) == 0;
}
Я был сбит с толку, что делает "& 0xff"?
2 ответа
& 0xff
извлекает 8 младших битов из полученного значения, игнорируя любые старшие биты.
Это не правильно. Ошибочная идея в том, что char
8 бит.
Это также бессмысленно. Предполагаемая проблема заключается в том, что m
может иметь больше битов, чем char
(правда), чтобы "ненужные" биты были замаскированы.
Но m
является расширенным знаком. Это означает, что знаковый бит копируется в старшие биты. Теперь, когда мы сравниваем x==0
мы проверяем, все ли биты равны нулю, и с x & 0xff
мы сравниваем, если младшие 8 бит равны нулю. Если 8-й бит x копируется во все более высокие позиции (с помощью расширения знака), то эти два условия одинаковы независимо от того, был ли скопированный бит 0 или 1.