Текущий архив: 2011.11.06;
Скачать: CL | DM;
Вниз
Ротация бит Найти похожие ветки
← →
Weei (2011-07-08 19:33) [0]Здравствуйте.
Кто нибуть сталкивался/знает алгоритм (возможно даже команды) для ротации бит в памати исключая перевод в строки (желательно что бы на входе принимались указатель, размер и количество смещающихся бит )
Например:
var a:integer = $00000011;
...
Смещая в лево на 1 получим $00000110
p.s.
Я знаком с алгеброй логики.
← →
sniknik © (2011-07-08 19:52) [1]> Смещая в лево на 1 получим $00000110
вообще то $00000022
p.s.
> Я знаком с алгеброй логики.
да ну?
← →
Weei (2011-07-08 19:59) [2]
> > Смещая в лево на 1 получим $00000110вообще то $00000022p.
> s.> Я знаком с алгеброй логики.да ну?
я видимо не совсем понятно объяснил
если сдвиг на 1 в лево, то все биты сдвигаются в лево, а вытесненный бит добавляется в конец
пример (сдвиг влево на 1, 8ми разрядной последовательности):
00000011
00000110
00001100
00011000
00110000
нули с лева это для понятности их можно не писать.
← →
Dimka Maslov © (2011-07-08 20:04) [3]Неужели в самом деле нам запретили пользоваться shl и shr?
← →
Weei (2011-07-08 20:06) [4]написав
> var a:integer = $00000011
я ошибся, это 16тиричное представление, я хотел сказать в 2й системе, но в pascal так нельзя.
Мне хотелось бы избежать перевода из 10й в 2ю систему счисления да ещё и в строку сдвигать "буковки" и наоборот, есть что ни будь побыстрее ?
← →
DiamondShark © (2011-07-08 20:08) [5]Это троль.
← →
sniknik © (2011-07-08 20:08) [6]> я видимо не совсем понятно объяснил
1 бит влево, чего не понятного? но $ это 16-чное представление в дельфи.
теперь вместо никому не нужных объяснений сам посчитай
> $00000011;
> Смещая в лево на 1 получим $00000110
← →
antonn © (2011-07-08 20:08) [7]
> Это троль.
с двумя "л"
← →
sniknik © (2011-07-08 20:09) [8]> но в pascal так нельзя.
ДА НУ???
← →
sniknik © (2011-07-08 20:11) [9]хотя требуется уточнение - как нельзя? а то мало ли что ты там у себы внутри имеешь в виду.
← →
Weei (2011-07-08 20:12) [10]sniknik научите задавать значение переменным в 2й системе счисления без предварительных "конвертаций"...
← →
DVM © (2011-07-08 20:14) [11]
> Weei (08.07.11 20:06) [4]
function RotateLeftBits16(const Value: Word; const Bits: Byte): Word;
asm
MOV CL, DL
ROL AX, CL
end;
function RotateLeftBits32(const Value: LongWord; const Bits: Byte): LongWord;
asm
MOV CL, DL
ROL EAX, CL
end;
function RotateRightBits16(const Value: Word; const Bits: Byte): Word;
asm
MOV CL, DL
ROR AX, CL
end;
function RotateRightBits32(const Value: LongWord; const Bits: Byte): LongWord;
asm
MOV CL, DL
ROR EAX, CL
end;
← →
sniknik © (2011-07-08 20:15) [12]см. [9], что именно ты хочешь? константу? - не задается, значение? - в asm вставке можно с буквой b в конце.
← →
Германн © (2011-07-08 20:15) [13]Ассемблерной вставкой можно.
← →
Dimka Maslov © (2011-07-08 20:17) [14]
> sniknik научите задавать значение переменным в 2й системе
> счисления без предварительных "конвертаций"...
Для этих целей и придумана шестнадцатеричная система
← →
Weei (2011-07-08 20:19) [15]я знаю как работают shl и shr.
Var i: Integer;
Begin
i:= 1;
i:= i shr 1;
i:= i shl 1;
В результате в i будет 0, я же пытаюсь объяснить следующее
Если имеется битовая 8ми разрядная последовательность
00000001 (A)
сдвигаем влево на 1
00000010 (B)
сдвигаем вправо на 1
00000001 (с)
C совпадает с A, shl и shr работают иначе.
← →
DVM © (2011-07-08 20:20) [16]
> Германн © (08.07.11 20:15) [13]
> Ассемблерной вставкой можно.
можно и без вставки, только геморно и длинно выходит, для сравнения:function RotateLeftBits16(const Value: Word; const Bits: Byte): Word;
var I, B : Integer;
begin
Result := Value;
if Bits >= 16 then
B := Bits mod 16
else
B := Bits;
for I := 1 to B do
if Result and $8000 = 0 then
Result := Result shl 1
else
Result := Word(Result shl 1) or 1;
end;
← →
DVM © (2011-07-08 20:20) [17]
> Weei (08.07.11 20:19) [15]
> shl и shr работают иначе.
см [16]
← →
Weei (2011-07-08 20:21) [18]
> DVM
Вы сами писали код ? если да, можно зделать тоже для 64х битных значений ?
← →
sniknik © (2011-07-08 20:24) [19]> Вы сами писали код ?
да ты что! кто же сейчас сам пишет... сейчас код только "тырят" друг у друга в инете. не пишут, и "достают" (во всех смыслах :)).
← →
Weei (2011-07-08 20:26) [20]Я нехотел вас обидеть.
> "тырят" друг у друга
Вот поэтому и спросил, можно для 64х битных зделать?...
← →
DVM © (2011-07-08 20:27) [21]
> Weei (08.07.11 20:21) [18]
> Вы сами писали код ? если да, можно зделать тоже для 64х
> битных значений ?
нет я его не писал, это из Delphi Fundamentals
> если да, можно зделать тоже для 64х битных значений ?
А самому переделать паскалевский вариант не судьба? За тебя переделать?
← →
Weei (2011-07-08 20:32) [22]
> DVM
Спасибо за код.
ps
давно заметил чем вежливее общаюсь, тем грубее относятся.
← →
Rouse_ © (2011-07-08 20:37) [23]
> Weei (08.07.11 20:26) [20]
> Вот поэтому и спросил, можно для 64х битных зделать?...
сделать можно, но только тут есть проблема, дельфи для 64 бит еще нет, а так вообщеROL RAX, 1/ROR RAX, 1
сделает тебе сдвиг в нужном направлении под х64
← →
sniknik © (2011-07-08 20:39) [24]> дельфи для 64 бит еще нет
а зачем 64 код/дельфи? и в 32 битном есть 64битные типы.
← →
Weei (2011-07-08 20:40) [25]
> Rouse
ооооо это вы голубчик не в ту степь, в этой теме нет и намёка на 64х битную архитектуру, речь о 64х битных значениях, которые к вашему сведению поддерживались ещё на пентиум 1
← →
sniknik © (2011-07-08 20:41) [26]> ps
> давно заметил чем вежливее общаюсь, тем грубее относятся.
а ты попробуй вежливо разговаривать, а не просить глупых одолжений.
← →
Weei (2011-07-08 20:43) [27]мне на
> sniknik © (08.07.11 20:39) [24]
> > дельфи для 64 бит еще нета зачем 64 код/дельфи?
я балдею, где вы тут нашли 64 код я может хочу int64 "крутить", в идеале участок памяти размером N (n кратно 2)
даж в начале написал
> желательно что бы на входе принимались указатель, размер
> и количество смещающихся бит
← →
Weei (2011-07-08 20:46) [28]DVM единственный кто понял.
> а не просить глупых одолжений.
я незнаком с ассемблером, а паскалевский вариант не видел, тестил первые 4 предложенные функции.
← →
Rouse_ © (2011-07-08 20:46) [29]
> sniknik © (08.07.11 20:39) [24]
а... пардон, я чей-то подумал что вопрос именно под х64 идет
← →
DVM © (2011-07-08 20:49) [30]
> Weei (08.07.11 20:46) [28]
> а паскалевский вариант не видел
как это не видел
← →
Weei (2011-07-08 20:51) [31]Пропустил несколько постов, паге даун нажал быстро, случайно...
Уже увидел.
← →
DVM © (2011-07-08 20:54) [32]
> Weei (08.07.11 20:51) [31]
вот остальные, если интересно, для 64 бит переделать можно, для большей длины сложнее будет и медленнее. Зачем вертеть биты в большом буфере, что за задача такая?function RotateLeftBits16(const Value: Word; const Bits: Byte): Word;
var I, B : Integer;
begin
Result := Value;
if Bits >= 16 then
B := Bits mod 16
else
B := Bits;
for I := 1 to B do
if Result and $8000 = 0 then
Result := Result shl 1
else
Result := Word(Result shl 1) or 1;
end;
function RotateLeftBits32(const Value: LongWord; const Bits: Byte): LongWord;
var I, B : Integer;
begin
Result := Value;
if Bits >= 32 then
B := Bits mod 32
else
B := Bits;
for I := 1 to B do
if Result and $80000000 = 0 then
Result := Result shl 1
else
Result := LongWord(Result shl 1) or 1;
end;
function RotateRightBits16(const Value: Word; const Bits: Byte): Word;
var I, B : Integer;
begin
Result := Value;
if Bits >= 16 then
B := Bits mod 16
else
B := Bits;
for I := 1 to B do
if Result and 1 = 0 then
Result := Result shr 1
else
Result := (Result shr 1) or $8000;
end;
function RotateRightBits32(const Value: LongWord; const Bits: Byte): LongWord;
var I, B : Integer;
begin
Result := Value;
if Bits >= 32 then
B := Bits mod 32
else
B := Bits;
for I := 1 to B do
if Result and 1 = 0 then
Result := Result shr 1
else
Result := (Result shr 1) or $80000000;
end;
← →
sniknik © (2011-07-08 21:01) [33]> для большей длины сложнее будет и медленнее.
неа, только тип поменять... в D7 поддержан почти полностью. с чем и будут проблемы так это с отображением. перевод в строку почти везде кривой для 64 битного (с вариантами тоже проблемы).
> я балдею, где вы тут нашли
не балдей, учись читать.
← →
Weei (2011-07-08 21:03) [34]
> DVM
ух...
> Зачем вертеть биты в большом буфере, что за задача такая
Шифрование (в универе задали)
я думаю так, считываю из файла массив длинной 1024
var p:Pointer;
size:Integer;
var a:array [0..1023] of integer;
...
// тут я считал массив
...
p:=@a;
size:=1024*SizeOf(Integer);
а далее, перед применением "основного" алгоритма
RotateRightBits(p, size, N); // N - вычисляется
Я думаю участок памяти за 1н раз "прокрутить" быстрее чем по a[i] обращаться.
← →
sniknik © (2011-07-08 21:06) [35]> Я думаю участок памяти за 1н раз "прокрутить" быстрее чем по a[i] обращаться.
в дворники. срочно!
← →
Rouse_ © (2011-07-08 21:06) [36]
> Weei (08.07.11 20:40) [25]
> ооооо это вы голубчик не в ту степь
Спасибо, голубчик, каюсь и посыпаю пеплом морщины :)function RotateLeft64(Value: int64; Count: Byte): int64;
function RepeatRol(Value: int64): int64;
begin
Result := ((Value and $8000000000000000) shr 63) + Value shl 1;
end;
var
I: Integer;
begin
Result := Value;
for I := 0 to Count - 1 do
Result := RepeatRol(Result);
end;
function RotateRoght64(Value: int64; Count: Byte): int64;
function RepeatRol(Value: int64): int64;
begin
Result := ((Value and 1) shl 63) + Value shr 1;
end;
var
I: Integer;
begin
Result := Value;
for I := 0 to Count - 1 do
Result := RepeatRol(Result);
end;
← →
Rouse_ © (2011-07-08 21:07) [37]зы: так вот без очепяток, бо на коленке писал:
function RotateRight64(Value: int64; Count: Byte): int64;
function RepeatRor(Value: int64): int64;
begin
Result := ((Value and 1) shl 63) + Value shr 1;
end;
var
I: Integer;
begin
Result := Value;
for I := 0 to Count - 1 do
Result := RepeatRor(Result);
end;
← →
Weei (2011-07-08 21:08) [38]
> Rouse_
Спасибо
надеюсь я это осилю....
← →
DVM © (2011-07-08 21:09) [39]
> sniknik © (08.07.11 21:01) [33]
> неа, только тип поменять... в D7 поддержан почти полностью.
эээ... я не понял ты о каком типе?
← →
DiamondShark © (2011-07-08 21:09) [40]
> Шифрование (в универе задали)
Да, точно. С двумя "л".
← →
Weei (2011-07-08 21:10) [41]Удалено модератором
Примечание: Флудить завязывай
← →
Weei (2011-07-08 21:13) [42]
> DiamondShark © (08.07.11 21:09) [40]
> > Шифрование (в универе задали)Да, точно. С двумя "л".
что c двумя "л", слово "задали" ? :)
← →
Weei (2011-07-08 21:17) [43]Удалено модератором
← →
sniknik © (2011-07-08 21:24) [44]> эээ... я не понял ты о каком типе?
UInt64
← →
DVM © (2011-07-08 21:26) [45]
> sniknik © (08.07.11 21:24) [44]
> UInt64
а, так я же и написал, что для 64 переделать можно, а медленнее и длиннее - это для > 64 бит, типов же таких в Delphi нет готовых.
← →
Weei (2011-07-08 21:30) [46]а UInt64 какая разница, я ж с указателями работаю.
← →
DVM © (2011-07-08 21:32) [47]
> Weei (08.07.11 21:30) [46]
> а UInt64 какая разница, я ж с указателями работаю.
Гипотетическому коду, который тобой еще не написан разницы может и нет, а по аналогии с функциями выше > 64 бит не сделать.
← →
Плохиш © (2011-07-08 21:32) [48]
> Weei (08.07.11 20:19) [15]
>
> я знаю как работают shl и shr.
>
> Var i: Integer;
> Begin
> i:= 1;
> i:= i shr 1;
> i:= i shl 1;
>
> В результате в i будет 0, я же пытаюсь объяснить следующее
>
> Если имеется битовая 8ми разрядная последовательность
>
> 00000001 (A)
>
> сдвигаем влево на 1
>
> 00000010 (B)
>
> сдвигаем вправо на 1
>
> 00000001 (с)
>
> C совпадает с A, shl и shr работают иначе.
Мая не плякать, мая ржать.
Дизайнер ландшафта трындит одно делает другое, а виноваты, как всегда, операторы делфи.
Не ври, shl и shr работают так как и описано.
← →
sniknik © (2011-07-08 21:33) [49]> это не флуд ?
это факт. ... если ты для скорости собираешься прокручивать массив битовыми операциями вместо "индексного взятия по указателю" ... нужно спасать программирование. причем в менеджеры или не дай Гейтс начальники, не годится, менеджер уверенный, что знает программирование, такого натворить может... близко к программистам подпускать нельзя в общем, в дворники в самый раз.
> это для > 64 бит, типов же таких в Delphi нет готовых.
наборы? вроде до 256.
← →
sniknik © (2011-07-08 21:34) [50]> а по аналогии с функциями выше > 64 бит не сделать.
по аналогии да, не сделать.
← →
Weei (2011-07-08 21:37) [51]
> Плохиш
выполни
Var i: Integer;
Begin
i:= 1;
i:= i shr 1;
i:= i shl 1;
end;
И скажи что у тебя в i будет ? а я тебе скажу 0, никак не 1, думай дальше
> Дизайнер ландшафта
← →
Плохиш © (2011-07-08 21:40) [52]
> Weei (08.07.11 21:37) [51]
А с какого там должна взяться 1? Справку по используемым операторам прочитай.
PS. Радует, что хоть подписываться ты уже научилось.
← →
Dimka Maslov © (2011-07-08 21:43) [53]
> я знаю как работают shl и shr.
>
> Var i: Integer;
> Begin
> i:= 1;
> i:= i shr 1;
> i:= i shl 1;
>
> В результате в i будет 0, я же пытаюсь объяснить следующее
>
> Если имеется битовая 8ми разрядная последовательность
>
> 00000001 (A)
>
> сдвигаем влево на 1
>
> 00000010 (B)
>
> сдвигаем вправо на 1
>
> 00000001 (с)
>
> C совпадает с A, shl и shr работают иначе.
Если сначала сдвигаем влево, а потом вправо, тогда и пишем с о о т в е т с т в е н н о
i:= 1;
i := i shl 1;
i := i shr 1;
ибо в аншлийском языке лево = left право = right
← →
Inovet © (2011-07-08 21:44) [54]> [51] Weei (08.07.11 21:37)
> i:= i shr 1;
> i:= i shl 1;
Местами поменяй. А сочтёшь нужным - извинись.
← →
Palladin © (2011-07-08 21:44) [55]
> Weei (08.07.11 21:37) [51]
это когда веником махать, мусор сохраняется, а когда сдвигаешь направо, информация теряется... иди мусором махай, раз запрос правильно в гугле не написать никак...
http://www.google.ru/search?client=opera&rls=ru&q=rotate+bit&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest
http://en.wikipedia.org/wiki/Circular_shift
← →
Weei (2011-07-08 21:45) [56]
> sniknik
Я не программист я только учусь ... всё таки нужно как то отделять обучающихся от специалистов, а у вас всё в куче...
А насчёт массива, разве нельзя используя move большую часть массива перенести на "новое" место, предварительно обработав начало и конец битовыми операциями?
Крутить 1024*8=8192 бит побитово это вам в голову пришло ....
← →
DVM © (2011-07-08 21:47) [57]
> Weei (08.07.11 21:45) [56]
> всё таки нужно как то отделять обучающихся от специалистов
это тут атмосфера такая спецфичная, не принимай близко к сердцу. С тобой еще по божески, можно сказать, обходятся. :)
← →
Palladin © (2011-07-08 21:49) [58]выживают сильнейшие )
← →
Weei (2011-07-08 21:50) [59]
> Плохиш
Мне нужно что бы возможно было произвести "обратное" преобразование
а ты почему то упёрся в shl и shr и более вариантов не видиш, я даж незнаю, DVM попробуй ты ему обьяснить у меня слов нет.
Если потребуется именно shr, а потом shl никак не соответственно.
← →
Weei (2011-07-08 21:51) [60]Удалено модератором
← →
Игорь Шевченко © (2011-07-08 21:53) [61]
> Я не программист я только учусь
вот и учись не клянчить по форумам
← →
Weei (2011-07-08 21:53) [62]Я писал
> А насчёт массива, разве нельзя используя move большую часть
> массива перенести на "новое" место, предварительно обработав
> начало и конец битовыми операциями?
Как думаете эта идея жизнеспособна ?
← →
Inovet © (2011-07-08 21:53) [63]> [56] Weei (08.07.11 21:45)
> Я не программист я только учусь ... всё таки нужно как то
> отделять обучающихся от специалистов
Ты сам сказал "я знаком", "я знаю". Сказал бы сразу - хочу научится.
← →
Palladin © (2011-07-08 21:57) [64]
> > А насчёт массива, разве нельзя используя move большую
> часть > массива перенести на "новое" место, предварительно
> обработав > начало и конец битовыми операциями?
одной командой битовый сдвиг на гигабайте - нет, не для все пейсателей интел еще приспособилась... хотя мля на очереди походу... чего они там только не придумали...
← →
Weei (2011-07-08 21:57) [65]Я подобные задачи решил оч. не рационально перпеводами из 1й системы счисления в др, а сюда обратился за советом к более опытным, а тут оказываются троли, и проч живность водится :)
← →
sniknik © (2011-07-08 21:57) [66]> разве нельзя используя move большую часть массива перенести на "новое" место
можно. но move не битовая операция, а байтовая/...
> предварительно обработав начало и конец битовыми операциями?
т.е. весь масив передвинуть на байт например, а конец и начало на бит? и что это получится?
> Крутить 1024*8=8192 бит побитово это вам в голову пришло ....
как сказано, и о чем разговор идет. если меняешь тему то говори про что речь сейчас.
← →
Плохиш © (2011-07-08 21:59) [67]
> Я подобные задачи решил оч. не рационально перпеводами из
> 1й системы счисления в др
Можно огласить весь список систем счисления, которыми может оперировать процессор?
← →
Inovet © (2011-07-08 21:59) [68]> [62] Weei (08.07.11 21:53)
> Как думаете эта идея жизнеспособна ?
На кратное 8, а иначе в каждом элементе надо сдвигать биты и с учетом соседних. Сложного ничего нет. Сделай на бумаге сначала схему сдвига, потом программно реализуй.
12345678 12345678 12345678
сдвигаем влево на 2
34567812 34567812 34567812
← →
Palladin © (2011-07-08 22:00) [69]
> Можно огласить весь список систем счисления, которыми может
> оперировать процессор?
да откуда он у него ) парень считает что процессор процедуры делфи выполняет за шаг и на OnClick у баттона один такт процессора уходит )
← →
sniknik © (2011-07-08 22:02) [70]> перпеводами из 1й системы счисления в др
это как? как ты заставил комп считать в другой системе счисления? он троичной к примеру не понимает... ;(
говори используя не "умные" слова, а понятные. кодом например говори...
← →
Inovet © (2011-07-08 22:02) [71]> [65] Weei (08.07.11 21:57)
> решил оч. не рационально перпеводами из 1й системы счисления в др
В памяти данные в одной системе хранятся - в двоичной, не говорим об экзотике BCD.
← →
DVM © (2011-07-08 22:04) [72]
> sniknik © (08.07.11 22:02) [70]
> это как? как ты заставил комп считать в другой системе счисления?
>
он в строку перевел
← →
Weei (2011-07-08 22:05) [73]Всем спасибо, с утра на свежую голову буду куралесить
тему можно закрыть
← →
Rouse_ © (2011-07-08 22:06) [74]
> Weei (08.07.11 21:45) [56]
> А насчёт массива, разве нельзя используя move большую часть
> массива перенести на "новое" место, предварительно обработав
> начало и конец битовыми операциями?
ЗАвисит от массива, иногда можно, иногда нельзя...
← →
sniknik © (2011-07-08 22:06) [75]> не говорим об экзотике BCD.
в итоге все одно двоичная.
> он в строку перевел
догадался.
← →
Weei (2011-07-08 22:08) [76]Удалено модератором
← →
Weei (2011-07-08 22:08) [77]Удалено модератором
← →
Inovet © (2011-07-08 22:10) [78]> [76] Weei (08.07.11 22:08)
> а некоторые до сих пор вокруг, да около ?),
Ты ждёшь готовый код?
← →
Palladin © (2011-07-08 22:11) [79]) я вижу как DVM вошел в строку )
← →
Игорь Шевченко © (2011-07-08 22:17) [80]
> тему можно закрыть
хозяин барин
Страницы: 1 2 вся ветка
Текущий архив: 2011.11.06;
Скачать: CL | DM;
Память: 0.68 MB
Время: 0.011 c