Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как математически реализовать XOR  (Прочитано 15488 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
CrazyRabbit
Участник

il
Offline Offline

« : 03-03-2004 17:31 » 

Привет Всем!

Вопрос:  существует ли возможность реализовать побитовую операцию XOR через математические (и не только:) байтовые операции ?

Т.е. к примеру взяли Байт1 и Байт2, сложили, умножили, разделили, отбросили "излишки" и т.п. в любой последовательности и количествах. На выходе должны получить "Байт1 XOR Байт2"
Заранее спасибо за любую информацию или ссылки.
Записан
Anchorite
Гость
« Ответ #1 : 03-03-2004 18:10 » 

Через логические можно - b1 ^ b2 =  (b1 | b2) (~b1 | ~b2) -  (С/С++)
Через чисто арифметические - крепко сомневаюсь.  :?
Записан
CrazyRabbit
Участник

il
Offline Offline

« Ответ #2 : 03-03-2004 18:27 » 

Anchorite,  операции | и ~  также "побитовые" , а доступа к битам не имеется.

Сейчас проверю можно ли их заменить на арифметику.
Спасибо.
Записан
x77
Команда клуба

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 03-03-2004 18:56 » 

мда, задачка Улыбаюсь

a xor b = (a or b) and ((not a) or (not b)), т.е.

a xor b = ((a or b) and (((- (a + 1))) or (- (b + 1))))

CrazyRabbit, от not'а избавиться можно (not a = - (a + 1)), а вот с and и or, как ни странно, у меня нифига не вышло.
Записан

Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #4 : 04-03-2004 03:58 » 

CrazyRabbit, а деление с остатком, взятие остатка, сравнение - есть? Тогда всегда можно до битов добраться. Общая идея:
х-(x/2)*2 при делении с остатком даст значение младшего бита и т.д. А дальше - XOR для одного бита - это просто сложение с отбрасыванием переноса.
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
CrazyRabbit
Участник

il
Offline Offline

« Ответ #5 : 04-03-2004 09:34 » 

Sashok,  Это то что надо, спасибо.
Записан
CrazyRabbit
Участник

il
Offline Offline

« Ответ #6 : 04-03-2004 16:21 » 

Ок.
Вот рабочая функция XOR_Function для ну очень высокоуровнего языка, как в моем случае.
Привожу в С-ной форме, так мне привычнее. Улыбаюсь

char XOR_Function( char A, char B )
{
   char Result = 0;
   for( int i = 0; i < 8; i++ )
  {
      if( A % 2  !=  B % 2 )
     {
          Result += pow( 2, i );
     }
     if( A == 1 )
     {
          A = 0;
      }
      A = A / 2;
      if ( B == 1 )
      {
            B = 0;
       }
       B = B / 2;
    }
    return Result;
}
Записан
CrazyRabbit
Участник

il
Offline Offline

« Ответ #7 : 04-03-2004 16:24 » 

Вот, блин! Отступы потерялись Жаль.
Записан
Kuzmich
Гость
« Ответ #8 : 05-03-2004 04:46 » 

Цитата: CrazyRabbit
Вот, блин! Отступы потерялись Жаль.

чтобы отступы не терялись, их нужно обрамлять тегами code
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines