![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Булева алгебра. Разминка.
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))