![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Pascal срочно, плзззз...
cok © (2002-03-30 14:55:00)Я сейчас пишу прогу на Паскале, вот. Проблева в следующем:
у меня есть число в 10-ной системе счисления, я перевожу его в 2-ую сист.сч., меняю местами некоторые 1 и 0, а потом перевожу это в 10-ую сист.сч, но число больше 6000, и поэтому, когда я его перевожу в 2-ую сист. по длине оно будет ого го, т.е длиннее чем LongInt! Я пытался использовать тип comp или extended, но тогда прога не правильно будет переводить число в 10-ую сист. сч. Че делать?
KSergey (2002-04-08 10:27:00) [21]А вообще это классно получается: дают человеку задачку (в некоем учебном заведении), он бросает ее в форум, на ответ говорит "а он неверен, сделайте чтоб работало!" после чего дожидается правильного решения, сдает его - ну и молодец короче. И это еще учитывая то, что задачи во всех учебных заведениях даются с расчетом на уровень троечника.
Далеко пойдешь, cok!
Хочется матом, да воспитание не позволяет.
PS: хотя обсуждение получилось весьма интересным, надо заметить.
cok (2002-04-01 20:07:00) [22]2 Alx2 © (01.04.02 14:57)
Большое вам спасибо! Ваш код работает верно.
Alx2 (2002-04-01 14:57:00) [23]Вот вариант на "чистом" ObjectPascal:
Function rormax(Val: Word): Word;
Var
K, HigherBitPos, LowBit: Integer;
Begin
Result := Val;
If Val = 0 Then exit;
HigherBitPos := trunc(ln(Val) / ln(2));
For K := 0 To HigherBitPos Do
Begin
LowBit := Val And 1;
Val := (Val Shr 1) Or (LowBit Shl HigherBitPos);
If Val > Result Then Result := Val;
End;
End;
cok (2002-04-01 14:22:00) [24]2 Anatoly Podgoretsky ©
Я так и догадался, но все равно работает НЕВЕРНО.
Anatoly Podgoretsky (2002-03-31 22:11:00) [25]У сеня что буква М, конечно исправь
И здесь конечно, код писался быстро
if F = 1 then N := N or $8000;
Мог бы догадаться
cok (2002-03-31 21:51:00) [26]>JibSkeart © (31.03.02 19:36)
Твой код работает неверно!
cok (2002-03-31 21:49:00) [27]>Anatoly Podgoretsky © (31.03.02 15:19)
>max := N;
>for i := 1 to 16 do begin
> F := N and 1;
> M := N shr 1;
> if F = 1 then N or $8000;
> if N > Max then Max := N;
>end;
> M := N shr 1;Здесь, наверно, надо написать N:=N shr 1;
> if F = 1 then N or $8000;Здесь ошибка, но не пойму какая.
Anatoly Podgoretsky (2002-03-31 20:44:00) [28]может и 16 и 32 зависит от префикса, но это не касается Дельфи, только 32
Anatoly Podgoretsky (2002-03-31 20:27:00) [29]Ну ок уточнили.
Rooman (2002-03-31 20:25:00) [30]Уже начиная с 386 процессора LOOP оперирует с 32-разрядным счетчиком:)
JibSkeart (2002-03-31 20:05:00) [31]насчет ecx 32 я мог ошибится так как с 32-х битным счетчиком
я не сталкивался (не приходилось)
//Во вторых по твоим словам в старом турбо паскале нельзя использовать асмь команды, только TASM или MASM, это не так, начиная с версии 6, можно напрямую, а до этого inline
про Tasm, Masm я имелл виду то что так можно работать с 32 бит рег.
но не имелл ввиду то что паскаль не знает асма
А с 32б мона работать и через db константы ...
на пискале (досявом)
Anatoly Podgoretsky (2002-03-31 19:55:00) [32]Ты видимо не представляешь как работает команда loop в 32 битном компиляторе, так вот она учитывает не только cx, но и e.
К тому же ты путаешь 32 битный счетчик с 16 битными рабочими регистрами ax, dx
Во вторых по твоим словам в старом турбо паскале нельзя использовать асмь команды, только TASM или MASM, это не так, начиная с версии 6, можно напрямую, а до этого inline
вот в 16 разрядном компиляторе, конечно нужно mov cx,16
JibSkeart (2002-03-31 19:36:00) [33]Вопервых если он пишет на паскале под досем ...
то сакс
он не поддерживает 32-х битные регистры .. :((
можно но только на TASMe или MASME написать и в OBJ
а потом оттуда ... но енто ...
function MaxCombo(N: Word) : Word;assembler еще одна поправка
asm
mov dx,ax
mov ecx,16 --- есх 32-х битный да и зачем ?? ты все рано значение для шетчика пихаеш 16 а может быть 32 ??
@1:
ror dx,1
cmp ax,dx
jb @2
mov ax,dx
@2:
loop @1
end;
да и к томуже по его словам
N (1<=N<=65535).
и не нужна 32 битная математика .65535= 16 бит
Anatoly Podgoretsky (2002-03-31 19:06:00) [34]Вот если бы не приходилось вытягивать, что именно нужно, была бы красота
Rooman (2002-03-31 18:25:00) [35]Вот на все бы вопросы такие ответы были - красота! :)))
Rooman (2002-03-31 18:23:00) [36]да, Анатолий, ecx не заметил... опечаточка вышла...
Anatoly Podgoretsky (2002-03-31 17:16:00) [37]Rooman © (31.03.02 16:14)
Я не был уверен, что допустимы асм коды, но могу поправить код, а то он с ошибкой, не учитывается 32 битная математика.
Во первых превратив его в функцию
function MaxCombo(N: Word) : Word;
asm
mov dx,ax
mov ecx,16
@1:
ror dx,1
cmp ax,dx
jb @2
mov ax,dx
@2:
loop @1
end;
JibSkeart (2002-03-31 16:32:00) [38]Rooman ©
Угу точно
Ну немного опередил меня ... :))
Rooman (2002-03-31 16:14:00) [39]в ассемблере есть инструкции
ROR register,count - циклическое вращение вправо
ROL register,count - циклическое вращение влево
в связи с этим код Анатолия Подгорецкого упрощается:
var NNN:word;
...
asm
mov ax,NNN
mov dx,ax
mov cx,16
@1:
ror dx,1
cmp ax,dx
jb @2
mov ax,dx
@2:
loop @1
mov NNN,ax
end;
коротко и быстро!
JibSkeart (2002-03-31 16:06:00) [40]Да а нужно ли все енти переводы оттуда туда
всмысле из десятичной в двоичную и ....