Страница 1 из 1

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

Добавлено: 28 мар 2004, 13:39
Tim
Для двоичного пердставления целого нужно один правый ноль заменить на единицу без циклов. Например для числа 1010 0011 должно получиться 1010 0111.

Добавлено: 29 мар 2004, 20:19
Romeo
Без циклов не получится никак (есть вариации с loop на asm'е, но это ведь тоже цикл). Если ограничение на отсутствие цикла снять, то можно так:

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

void ChangeInt(int & iInput)
{
   int iMask = 0x1;

   while(iInput & iMask == iInput)
   {
      iMask <<= 1;
   } 

   iInput &= iMask;
}

Добавлено: 30 мар 2004, 11:35
Tim
Нет, с циклами не интересно... :-) Это оллимпиадная задача. Фикус именно в отсутствии циклов.

Добавлено: 30 мар 2004, 11:51
Romeo
Раскрой оператор цикла и преврати его в линей код :)

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

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-битного целого :)

Добавлено: 30 мар 2004, 16:51
Eugie
Раскрой оператор цикла и преврати его в линей код
Точно!

Romeo, только одна поправка - вместо & надо | , иначе != не сработает.

Добавлено: 30 мар 2004, 18:52
Tim
А как вам такое изящное решение:
X |= (X+1);
:-)

Добавлено: 31 мар 2004, 10:41
Romeo
Клёво

Добавлено: 31 мар 2004, 12:02
Tim
Как можно догаться X &= (X-1) онуляет правую единицу.

Добавлено: 31 мар 2004, 17:35
Eugie
Нет предела совершенству :)