Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Булева алгебра. Разминка.


Страницы:   1 2

Johnmen ©   (2007-04-17 11:18:00) 

Всем привет!

Поможите старому больному программисту, дайте немного байтов кода (чем меньше, тем лучше) для поддержания на плаву никому не нужной программы. :)

Суть задачи.
Имеется:
I, J : integer;
B : boolean;
Требуется:
взвести J-ый бит в I, если B истинно, и
сбросить J-ый бит в I, если B ложно.

Кто решит, тот претендент на награду... :)
Просьба господ с голубыми значками не проявлять излишней активности...

Удачи! Спасибо!


Johnmen   (2007-04-17 12:46:00) [1]


> Sha ©   (17.04.07 12:29) [25]

Да, у меня тоже короче не выходит. И мой вар-т длиннее на 5 байт :)

Всем спасибо за участие!
Взбодрили старого больного программиста.
Приз будет вручён Sha при личной встрече ;)


Sha   (2007-04-17 12:29:00) [2]

> Johnmen ©   (17.04.07 12:22) [23]
> А ещё короче сможешь? :)

Если надо одним паскальным оператором - то не получится.
При помощи первого and мы всегда сбрасываем бит,
а последующий or поднимает его, если требуется.


DrPass   (2007-04-17 12:22:00) [3]

Забыл добавить еще один or ord(b) shl j


Johnmen   (2007-04-17 12:22:00) [4]


> Sha ©   (17.04.07 12:02) [14]

А ещё короче сможешь? :)


DrPass   (2007-04-17 12:20:00) [5]


> Sha ©   (17.04.07 12:17) [21]

Да, ты прав :)

> Johnmen ©   (17.04.07 12:11) [20]

И ты :)


Sha   (2007-04-17 12:17:00) [6]

> DrPass ©   (17.04.07 11:46) [7]
> i:= i and (.....)

Че-то не въеду, этим ты тока сбросишь биты, а установка где?


Johnmen   (2007-04-17 12:11:00) [7]


> DrPass ©   (17.04.07 11:46) [7]
> Sha ©   (17.04.07 12:02) [14]

Что, засомневались? :)
Всё правильно.... Только у Sha покороче...


Amoeba   (2007-04-17 12:10:00) [8]

А если задействовать следующие ф-ии (взято из QStrings) для установки и сброса бита?

function Q_BitSet(P: Pointer; Index: Integer): Boolean;
asm
       BTS     [EAX],EDX
       SETC    AL
end;

function Q_BitReset(P: Pointer; Index: Integer): Boolean;
asm
       BTR     [EAX],EDX
       SETC    AL
end;


DrPass   (2007-04-17 12:09:00) [9]


> Johnmen ©   (17.04.07 12:02) [15]

Почему? Работает (при условии соблюдения диапазонов значений, естессно)


Sha   (2007-04-17 12:09:00) [10]

> Johnmen ©   (17.04.07 12:05) [16]

Наверно, какие-то исходные данные дают неврный результат? ))


Johnmen   (2007-04-17 12:05:00) [11]


> Sha ©   (17.04.07 12:02) [14]

И у тебя ошибочка :)


Sha   (2007-04-17 12:02:00) [12]

Ну тогда так

 i:=i and (not (1 shl j)) or (ord(b) shl j);


Johnmen   (2007-04-17 12:02:00) [13]


> DrPass ©   (17.04.07 11:46) [7]

Тут у вас ошибочка вышла...:)


Сергей М.   (2007-04-17 12:00:00) [14]


> Johnmen ©   (17.04.07 11:58) [11]


> исх.текста


Не, это не наш метод))


Сергей М.   (2007-04-17 11:59:00) [15]


> DrPass ©   (17.04.07 11:55) [10]


Нет, конечно)


Johnmen   (2007-04-17 11:58:00) [16]


> "чем меньше" чего - исх.текста или машкода ?)

исх.текста

> Sha ©   (17.04.07 11:49) [8]

Не, это не наш метод :)


DrPass   (2007-04-17 11:55:00) [17]


> Сергей М. ©   (17.04.07 11:50) [9]

Включая инициализацию регистров или нет?


Сергей М.   (2007-04-17 11:50:00) [18]

Уложусь в 16 байт машкода при условии локальности переменных i,j,b.
Кто меньше ?)


Sha   (2007-04-17 11:49:00) [19]

 
 if b
 then i:=i or (1 shl j)
 else i:=i and (not (1 shl j));


DrPass   (2007-04-17 11:46:00) [20]

i:= i and (integer(b) shl j or not(1 shl j))


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо