Форум: "Начинающим";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];
ВнизБулева алгебра. Разминка. Найти похожие ветки
← →
Johnmen © (2007-04-17 11:18) [0]Всем привет!
Поможите старому больному программисту, дайте немного байтов кода (чем меньше, тем лучше) для поддержания на плаву никому не нужной программы. :)
Суть задачи.
Имеется:
I, J : integer;
B : boolean;
Требуется:
взвести J-ый бит в I, если B истинно, и
сбросить J-ый бит в I, если B ложно.
Кто решит, тот претендент на награду... :)
Просьба господ с голубыми значками не проявлять излишней активности...
Удачи! Спасибо!
← →
Leonid Troyanovsky © (2007-04-17 11:26) [1]
> Johnmen © (17.04.07 11:18)
> Кто решит, тот претендент на награду... :)
Премию Дарвина?
Ухожу, ухожу.
--
Regards, LVT.
← →
Johnmen © (2007-04-17 11:33) [2]
> Leonid Troyanovsky © (17.04.07 11:26) [1]
> Премию Дарвина?
Ещё не решил. Посмотрим :)
← →
Desdechado © (2007-04-17 11:37) [3]А если J отрицательное или больше 31?
← →
Сергей М. © (2007-04-17 11:40) [4]
> чем меньше, тем лучше
"чем меньше" чего - исх.текста или машкода ?)
← →
DrPass © (2007-04-17 11:42) [5]
> А если J отрицательное или больше 31?
цивилизация окажется на грани гибели
← →
Ega23 © (2007-04-17 11:45) [6]
> Johnmen © (17.04.07 11:18)
У меня где-то была такая ботва. Одной сточкой. Вроде даже ты мне её и давал... :)
← →
DrPass © (2007-04-17 11:46) [7]i:= i and (integer(b) shl j or not(1 shl j))
← →
Sha © (2007-04-17 11:49) [8]
if b
then i:=i or (1 shl j)
else i:=i and (not (1 shl j));
← →
Сергей М. © (2007-04-17 11:50) [9]Уложусь в 16 байт машкода при условии локальности переменных i,j,b.
Кто меньше ?)
← →
DrPass © (2007-04-17 11:55) [10]
> Сергей М. © (17.04.07 11:50) [9]
Включая инициализацию регистров или нет?
← →
Johnmen © (2007-04-17 11:58) [11]
> "чем меньше" чего - исх.текста или машкода ?)
исх.текста
> Sha © (17.04.07 11:49) [8]
Не, это не наш метод :)
← →
Сергей М. © (2007-04-17 11:59) [12]
> DrPass © (17.04.07 11:55) [10]
Нет, конечно)
← →
Сергей М. © (2007-04-17 12:00) [13]
> Johnmen © (17.04.07 11:58) [11]
> исх.текста
Не, это не наш метод))
← →
Sha © (2007-04-17 12:02) [14]Ну тогда так
i:=i and (not (1 shl j)) or (ord(b) shl j);
← →
Johnmen © (2007-04-17 12:02) [15]
> DrPass © (17.04.07 11:46) [7]
Тут у вас ошибочка вышла...:)
← →
Johnmen © (2007-04-17 12:05) [16]
> Sha © (17.04.07 12:02) [14]
И у тебя ошибочка :)
← →
Sha © (2007-04-17 12:09) [17]> Johnmen © (17.04.07 12:05) [16]
Наверно, какие-то исходные данные дают неврный результат? ))
← →
DrPass © (2007-04-17 12:09) [18]
> Johnmen © (17.04.07 12:02) [15]
Почему? Работает (при условии соблюдения диапазонов значений, естессно)
← →
Amoeba © (2007-04-17 12:10) [19]А если задействовать следующие ф-ии (взято из 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;
← →
Johnmen © (2007-04-17 12:11) [20]
> DrPass © (17.04.07 11:46) [7]
> Sha © (17.04.07 12:02) [14]
Что, засомневались? :)
Всё правильно.... Только у Sha покороче...
← →
Sha © (2007-04-17 12:17) [21]> DrPass © (17.04.07 11:46) [7]
> i:= i and (.....)
Че-то не въеду, этим ты тока сбросишь биты, а установка где?
← →
DrPass © (2007-04-17 12:20) [22]
> Sha © (17.04.07 12:17) [21]
Да, ты прав :)
> Johnmen © (17.04.07 12:11) [20]
И ты :)
← →
Johnmen © (2007-04-17 12:22) [23]
> Sha © (17.04.07 12:02) [14]
А ещё короче сможешь? :)
← →
DrPass © (2007-04-17 12:22) [24]Забыл добавить еще один or ord(b) shl j
← →
Sha © (2007-04-17 12:29) [25]> Johnmen © (17.04.07 12:22) [23]
> А ещё короче сможешь? :)
Если надо одним паскальным оператором - то не получится.
При помощи первого and мы всегда сбрасываем бит,
а последующий or поднимает его, если требуется.
← →
Johnmen © (2007-04-17 12:46) [26]
> Sha © (17.04.07 12:29) [25]
Да, у меня тоже короче не выходит. И мой вар-т длиннее на 5 байт :)
Всем спасибо за участие!
Взбодрили старого больного программиста.
Приз будет вручён Sha при личной встрече ;)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.047 c