для x и y, вы можете разделить биты, сложить их вместе и получить тот же ответ, верно?
пример:
0101 (x) + 0110 (y) == (0100 + 0001) + (0100 + 0010)
сейчас. просмотр ваших логических операторов:
a & b
дает вам биты, которые находятся в обоих числах (чтение: счетчик 2)
a | b
дает вам биты, которые находятся в либо число (читай: количество ≥1)
так что в основном вы берете биты, которые есть в любом числе, суммируя их вместе:
0111 == 0100 (in x, y) + 0010 (in y) + 0001 (in x)
вы также взяв биты, которые есть в обоих числах (то есть биты, которые вам нужно посчитать дважды), и добавив их к сумме:
0100 == 0100 (in x, y)
так, вы в конечном итоге добавите биты, которые появляются один раз, один раз, и биты, которые появляются дважды, дважды:
0111 (bits that appear once or twice) + 0100 (bits that appear twice)