Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Andrew Kadatch                       2:5020/400     12 May 2001  12:01:57
 To : All
 Subject : Re: найти переменную...
 -------------------------------------------------------------------------------- 
 
 > можно ли(и как) найти b зная bb1 и bb0 имея:
 >
 > bb1=(bb0+b) xor (bb0-b)
 
 Можно. Перебором с возвращениями от младших битов к старшим.
 Предупреждение: для большинства пар (bb0, bb1) существует много b,
 удовлетворяющих вышеприведенному равенству.
 
 См. текст примитивного поиска ниже. Поскольку тратить на это
 больше 10 минут не хочется, избавиться от хвостовой рекурсии и
 получить все решения (а не только первое попавшееся) предлагается
 читателю.
 
 #include <stdio.h>
 #include <stdlib.h>
 
 // find b such that b1 = (b0 + b) ^ (b0 - b)
 // return 1 if such b exist, 0 otherwise
 int FindB (int *pb, int b0, int b1, int b, int m)
 {
   if (m == -1)
   {
     *pb = b;
     return (1);
   }
   m = m*2 + 1;
   if ((b1 & m) == (((b0 + b) ^ (b0 - b)) & m))
   {
     if (FindB (pb, b0, b1, b, m))
       return (1);
   }
   b += m ^ (m >> 1); // try to set next bit to 1
   if ((b1 & m) == (((b0 + b) ^ (b0 - b)) & m))
     return (FindB (pb, b0, b1, b, m));
   return (0);
 }
 
 int main (void)
 {
   int i, b, b0, b1, br;
 
   for (i = 0; i < 10; ++i)
   {
     b = rand ();
     b0 = rand ();
     b1 = (b0 + b) ^ (b0 - b);
 
     printf ("b0=0x%x b=0x%x b1=0x%x\n", b0, b, b1);
     if (!FindB (&br, b0, b1, 0, 0))
       printf ("oops, expecting %x\n", b);
     else if (br == b)
       printf ("exact match\n");
     else
     {
       printf ("got br=0x%x, expecting b=0x%x\n", br, b);
       b = (b0 + br) ^ (b0 - br);
       if (b != b1)
         printf ("oops: got f(br)=0x%x, expecting f(b)=0x%x\n", b, b1);
       else
         printf ("result is the same\n");
     }
   }
 
   return (0);
 }
 --- ifmail v.2.15dev5
  * Origin: Demos online service (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 найти переменную...   — ¤   12 May 2001 01:03:47 
 Re: найти переменную...   Andrew Kadatch   12 May 2001 12:01:57 
 найти пеpеменнyю...   Edik Ryzhov   14 May 2001 13:44:00 
 найти пеpеменнyю...   Yuri Burger   15 May 2001 22:04:05 
 найти пеpеменнyю...   Edik Ryzhov   22 May 2001 09:09:10 
 найти пеpеменнyю...   Alexander Ryzhov   17 May 2001 18:57:47 
 найти пеpеменнyю...   Edik Ryzhov   21 May 2001 11:53:40 
 найти пеpеменнyю...   Alex Cvetkov   21 May 2001 19:02:07 
 найти пеpеменнyю...   Valery Volkov   27 May 2001 07:01:10 
 найти пеpеменнyю...   Alex Cvetkov   30 May 2001 13:10:02 
 Re: найти пеpеменнyю...   Comoderator Of Ru Algorithms   31 May 2001 18:03:48 
Архивное /ru.algorithms/65772eae8962.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional