Может кто-нибудь объяснить, как двоичное число переворачивается.
unsigned rev = 0;
unsigned k = n;
while (k)
{
// add rightmost bit to rev
rev = (rev << 1) | (k & 1);
k = k >> 1; // drop last bit
cout<<"k val is "<<bitset<8>(k)<<endl;
cout<<"rev val is "<<{bitset<8>(rev)<<endl;
}
Вывод, если n = 9
k val равен 00000100
rev valis 00000001
k val это 00000010
rev, значение 00000010
k val, 00000001
rev, значение 00000100
k val, 00000000
rev, значение 00001001
9, палиндром
Я имел в виду вопрос 2 отсюда: http://www.techiedelight.com/bit-hacks-part-6-random-problems/
Насколько я знаю, только первое выражение выполняется, если оно истинно для "|"УсловиеТаким образом, здесь rev << 1 будет false только для первого выполнения цикла, но не для остальных.Следовательно, как rev получает 1 в конце для последнего условия, потому что (k & 1) не будет выполнено.Только левый сдвиг будет выполнен верно?</p>