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

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

Pascal срочно, плзззз...


Страницы:   1 2 3 4

cok ©   (2002-03-30 14:55:00) 

Я сейчас пишу прогу на Паскале, вот. Проблева в следующем:
у меня есть число в 10-ной системе счисления, я перевожу его в 2-ую сист.сч., меняю местами некоторые 1 и 0, а потом перевожу это в 10-ую сист.сч, но число больше 6000, и поэтому, когда я его перевожу в 2-ую сист. по длине оно будет ого го, т.е длиннее чем LongInt! Я пытался использовать тип comp или extended, но тогда прога не правильно будет переводить число в 10-ую сист. сч. Че делать?


JibSkeart   (2002-03-31 15:56:00) [41]

65535 = FFFF = 16bit ??
255 = FF = 8bit ??
Нет а что незя использовать массив ??
помойму проше ...
(То есть переводишь в двоичный .. 0 и 1 бросаешь в массив
по порядку как есть :)
а сдвигать байты мона и в массиве сразу ..
)

я тут пример для 8 бит набросал перевода из битов в десятичное число
Program Test;
Uses
Crt;
Type
t=Array [0..7] of Byte; {or [0..31] !!! }
t1=^t;
Var
x:Word;
s:T1;
begin
ClrScr;
New(s);
s^[0]:=1; s^[1]:=0; s^[2]:=0; s^[3]:=0; s^[4]:=1; s^[5]:=0; s^[6]:=0;
s^[7]:=0; {10010b=34d}
asm
xor bx,bx
les di,[s]
mov al,[es:di]
shl al,1
add bl,al
mov al,[es:di+1]
shl al,2
add bl,al
mov al,[es:di+2]
shl al,3
add bl,al
mov al,[es:di+3]
shl al,4
add bl,al
mov al,[es:di+4]
shl al,5
add bl,al
mov al,[es:di+5]
shl al,6
add bl,al
mov al,[es:di+6]
shl al,7
add bl,al
mov al,[es:di+7]
shl al,8
add bl,al
{ ... }
mov x,bx
end;

Writeln(x);
Dispose(s);
end.

А вообше сдеся Вам инфы сказали люди предостаточно ...

Да и Помоему на Асме есть та функция которая передвигает биты (в лево и в право)причем с переносом битов (если я не ошибаюсь)


Rooman   (2002-03-31 15:53:00) [42]

интересно, где такою задачу применить можно?


Anatoly Podgoretsky   (2002-03-31 15:19:00) [43]

И всего то?

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;


cok   (2002-03-31 15:03:00) [44]

Простите, если невнятно объяснил суть задачи.
Приведу полный ее текст:
Дано целое десятичное число N (1<=N<=65535). Некто записал это число в двоичном формате и стал циклически сдвигать вправо, затем брать последнюю цифру числа и переносить ее в начало. Например, если N=11, то в 2-ом формате это 1011. После 1-го сдвига получим 1101, после 2-го - 1110, после 3-го 0111, после 4-го - исходное число 1011. Видно, что максимальное значение из всех полученных имеет число 1110, и это значение завно 14.
Требуется создать прогу, по которой для заданного числа N определяется максимальное значение числа, которое получится в результате вышеописанных сдвигов.


Rooman   (2002-03-31 12:08:00) [45]

А вот более оптимальный вариант той-же функции:

procedure swapbits(BitPos1,BitPos2:byte;var Number:longint);
var i1,i2,m:longint;tmp:byte;
begin
if BitPos1>BitPos2 then
begin
tmp:=BitPos1;
BitPos1:=BitPos2;
BitPos2:=tmp;
end;
i1:=1;
i2:=i1;
i1:=i1 shl BitPos1;
i2:=i2 shl BitPos2;
m:=BitPos2-BitPos1;
Number:=(Number and not(i1 or i2))xor (((Number and i1) shl m)xor((Number and i2) shr m));
end;


Rooman   (2002-03-31 11:37:00) [46]

2dymka - только в твоем варианте код компилируется неоптимально, хотя в данном случае это не критично.


Rooman   (2002-03-31 11:35:00) [47]

согласен:)


dymka   (2002-03-31 11:33:00) [48]

ес чо, то допустима такая конструкция

i1 := 1 shl BitPos1;
i2 := 1 shl BitPos2;


Rooman   (2002-03-31 11:30:00) [49]

P.S. меняет местами! Позиции битов нумеруются от 0 до 31!


Rooman   (2002-03-31 11:28:00) [50]

Короче, дело к ночи:)
Вот вам функция, которая меняет два любых бита в числе:

procedure swapbits(BitPos1,BitPos2:byte;var Number:longint);
var i1,i2,j,k:longint;
begin
i1:=1;
i2:=i1;
i1:=i1 shl BitPos1;
i2:=i2 shl BitPos2;
j:=Number and i1;
k:=Number and i2;
Number:=Number or i2 or i1;
if j=0 then Number:=Number xor i2;
if k=0 then Number:=Number xor i1;
end;


dymka   (2002-03-31 11:24:00) [51]

2Rooman - а никто и не спорит... :).
Но вдруг ему захочется все-таки перевести в двоичную строку :)
меняем i и j бит местами:


var
TempChar: char;
...
TempChar := BitStr[i];
BitStr[i] := BitStr[j];
BitStr[j] := TempChar;

Ну здесь еще такая фишка - нулевой бит это первый символ :)


Song   (2002-03-31 11:13:00) [52]

Если нужно написать операцию перевода bin <--> dec таким корявым алгоритмом, то нужно эти разряды которые после перевода "будут больше чем убирается в LongInt" надо хранить только в ShortString, а уж никак не в Int переменных.


Rooman   (2002-03-31 11:11:00) [53]

2dymka - булева алгебра нужна здесь для понимания сути. Алгоритм, основаный на булевой алгебре, работает много эффективнее, чем возиться со строками, имхо:)

Обмен битами можно сделать так:

Например, меняем нулевой и первый биты местами:

var i,j,k:longint;
...
i:=254;
//обмен 0 и 1 битов местами
j:=i and 1;//выделили нулевой бит
k:=i and 2;//выделили первый бит
if k>0 then i:=i or 1 else i:=i and not 1;
if j>0 then i:=i or 2 else i:=i and not 2;


Anatoly Podgoretsky   (2002-03-31 11:08:00) [54]

Rooman © (31.03.02 10:53)
Так у него проблема с

"но число больше 6000, и поэтому, когда я его перевожу в 2-ую сист. по длине оно будет ого го, т.е длиннее чем LongInt!"


dymka   (2002-03-31 10:56:00) [55]

2Rooman - он похоже не биты инвертировать собрался, а менять местами - тобишь пятый бит поставить на первое место, ну а первый на пятое...


dymka   (2002-03-31 10:54:00) [56]

Как уже сказал drpass, переводить для смены бит ничего не нужно... Существует такое понятие как битовые операции...
Это not, or, and, xor, shr итп... Поизучив их внимательнее, ты вероятно сможешь найти решение...
Второе - раз уж ты вздумал перевести десятичное число в двоичное, то количество цифр будет определятся логарифмом по основанию 2 плюс единица... поэтому нетрудно заметить, что число 6000 займет log2(6000) + 1 = 13.6 т.е. 13 разрядов...
Поэтому проще использовать строку для двоичного представления числа, кстати обмен битами в этом случае будет намного проще...


Rooman   (2002-03-31 10:53:00) [57]

Кранты! Мастера как дети отвечать стали! Куда мир катится!
Ответ на вопрос: чтобы поменять биты в числе совершенно не надо его ни во что конвертировать. Делаешь так:

var i:longint;

...
i:=6000;
...
//изменение нулевого бита на противоположный:
i:=i xor 1;
//обнуление нулевого бита:
i:=i and not 1;
//присвоение нулевому биту единицы:
i:=i or 1;

//тоже самое для пятого бита, к примеру
//изменение пятого бита на противоположный:
i:=i xor 32;
//обнуление пятого бита:
i:=i and not 32;
//присвоение пятому биту единицы:
i:=i or 32;

Число, которое будет у тебя вместо 1 или 32 вычисляется по формуле: число = 2 в степени номер_бита;




Anatoly Podgoretsky   (2002-03-31 10:19:00) [58]

Так ты про текст, а чего тогда приплел LongInt, да еще и comp вместе с extended.
Кажетмя полное непонимание, не мешало бы повнятнее.
Что такое числа и какие у них ограничения можешь посмотреть в хелпе по теме "About types" если тебе это поможет, очень уж запущено.

Fay © (31.03.02 05:12)
Как видишь не очень :-)


Fay   (2002-03-31 05:12:00) [59]

2cok
Не надо Вам так отвечать Anatoly Podgoretsky. Это уважаемый мастер.
Вопрос Ваш приведённой формулировке - полный бред (так мне кажется). Пожалуйста, уточните.


cok   (2002-03-30 19:36:00) [60]

>Anatoly Podgoretsky © (30.03.02 14:58)
>С какой стати у числа изменится размер от замены 0-1.
Размер у числа изменится, если я его из 10-ной сист.сч. переведу в 2-ую. Например, 11=1011, (цифр в два раза больше стало!)


Страницы:   1 2 3 4

Наверх

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