Вниз
Скачать: CL | DM;

Булева алгебра. Разминка.   Найти похожие ветки 

← →
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 вся ветка

Скачать: CL | DM;



Память: 0.5 MB
Время: 0.013 c
15-1176215375
Pazitron_Brain
2007-04-10 18:29
2007.05.06
Ноутбук с перепаянным портом для блока питания


5-1153210679
DevilDevil
2006-07-18 12:17
2007.05.06
Как отследить изменение размера TCustomControl компонента?


1-1173257292
tytus
2007-03-07 11:48
2007.05.06
Как перевести %USERPROFILE% - в C: Documents and Settings ...


3-1171881112
EvChul
2007-02-19 13:31
2007.05.06
Как узнать о завершении асинхронной операции.


2-1176866712
VitAngel
2007-04-18 07:25
2007.05.06
Получить свой IP и блокировка запуска второй копии программы




   Наверх