Установка разряда в двоичном представлении целого.
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Для двоичного пердставления целого нужно один правый ноль заменить на единицу без циклов. Например для числа 1010 0011 должно получиться 1010 0111.
[T.M.]
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Без циклов не получится никак (есть вариации с loop на asm'е, но это ведь тоже цикл). Если ограничение на отсутствие цикла снять, то можно так:
Код: Выделить всё
void ChangeInt(int & iInput)
{
int iMask = 0x1;
while(iInput & iMask == iInput)
{
iMask <<= 1;
}
iInput &= iMask;
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Нет, с циклами не интересно... :-) Это оллимпиадная задача. Фикус именно в отсутствии циклов.
[T.M.]
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Раскрой оператор цикла и преврати его в линей код 
Это случай 16-битного целого 

Код: Выделить всё
void ChangeInt(int & iInput)
{
if (iInput & 0x1 != iInput)
{
iInput &= 0x1;
return;
}
if (iInput & 0x2 != iInput)
{
iInput &= 0x2;
return;
}
if (iInput & 0x4 != iInput)
{
iInput &= 0x4;
return;
}
if (iInput & 0x8 != iInput)
{
iInput &= 0x8;
return;
}
if (iInput & 0x10 != iInput)
{
iInput &= 0x10;
return;
}
if (iInput & 0x20 != iInput)
{
iInput &= 0x20;
return;
}
if (iInput & 0x40 != iInput)
{
iInput &= 0x40;
return;
}
/*
...
*/
if (iInput & 0x800 != iInput)
{
iInput &= 0x80;
return;
}
}

Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Точно!Раскрой оператор цикла и преврати его в линей код
Romeo, только одна поправка - вместо & надо | , иначе != не сработает.
А как вам такое изящное решение:
X |= (X+1);
:-)
X |= (X+1);
:-)
[T.M.]
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Клёво
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Как можно догаться X &= (X-1) онуляет правую единицу.
[T.M.]
Нет предела совершенству 
