Установка разряда в двоичном представлении целого.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Tim
Сообщения: 8
Зарегистрирован: 19 мар 2004, 11:56
Откуда: Москва

Для двоичного пердставления целого нужно один правый ноль заменить на единицу без циклов. Например для числа 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Tim
Сообщения: 8
Зарегистрирован: 19 мар 2004, 11:56
Откуда: Москва

Нет, с циклами не интересно... :-) Это оллимпиадная задача. Фикус именно в отсутствии циклов.
[T.M.]
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Раскрой оператор цикла и преврати его в линей код :)

Код: Выделить всё

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;
   }
} 
Это случай 16-битного целого :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Раскрой оператор цикла и преврати его в линей код
Точно!

Romeo, только одна поправка - вместо & надо | , иначе != не сработает.
Tim
Сообщения: 8
Зарегистрирован: 19 мар 2004, 11:56
Откуда: Москва

А как вам такое изящное решение:
X |= (X+1);
:-)
[T.M.]
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Клёво
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Tim
Сообщения: 8
Зарегистрирован: 19 мар 2004, 11:56
Откуда: Москва

Как можно догаться X &= (X-1) онуляет правую единицу.
[T.M.]
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Нет предела совершенству :)
Ответить