Как определить, являются ли два 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.

Другие вопросы по тегам