битовые операции

7 views
Skip to first unread message

Andrew Kuksov

unread,
Nov 14, 2006, 6:32:46 PM11/14/06
to
Привет, Valery!

01 Авг 06 20:32, Valery Ivanov ---> All:

VI> 1) как "перевернуть" байт ?
VI> те изначально биты расположены 0,1,..7
VI> нужно получить байт с битами 7,6,..0
VI> интересует алгоритм (код на c++)
Думаю, что использовать таблицу - достаточно эффективный способ. Быстро и
просто.


Я еще вернусь, Valery... Удачи.

Nickita A Startcev

unread,
Nov 15, 2006, 10:59:18 AM11/15/06
to
Привет, Andrew !


15 Nov 06 , 02:32 Andrew Kuksov писал к Valery Ivanov:

VI>> 1) как "перевернуть" байт ?
VI>> те изначально биты расположены 0,1,..7
VI>> нужно получить байт с битами 7,6,..0
VI>> интересует алгоритм (код на c++)

AK> Думаю, что использовать таблицу - достаточно эффективный способ.
AK> Быстро и просто.

u8 src;
u8 dest;
...
dest = ( src >> 1 ) | ( ( src << 7 ) % 0x1;
если хочется на си.
Таблица, если хочется извратнуться.
Ассемблерные вставки, если переносимость нас не беспокоит.


. С уважением, Hикита.
... A че это вы осеннее обострение без меня затеяли?!

Andrew Kuksov

unread,
Nov 15, 2006, 4:27:24 PM11/15/06
to
Привет, Nickita!

15 Hоя 06 18:59, Nickita A Startcev ---> Andrew Kuksov:


VI>>> 1) как "перевернуть" байт ?
VI>>> те изначально биты расположены 0,1,..7
VI>>> нужно получить байт с битами 7,6,..0
VI>>> интересует алгоритм (код на c++)
AK>> Думаю, что использовать таблицу - достаточно эффективный способ.
AK>> Быстро и просто.

NAS>
NAS> u8 src;
NAS> u8 dest;
NAS> ...
NAS> dest = ( src >> 1 ) | ( ( src << 7 ) % 0x1;
NAS> если хочется на си.
И что получилось?

NAS> Таблица, если хочется извратнуться.
Таблица, по крайней мере, работает =)))

NAS> Ассемблерные вставки, если переносимость нас не беспокоит.
Hас беспокоит, в первую очередь, все-таки работоспособность и
сопровождабельность. Особые случаи рассматривать не стоит, ибо будь здесь такой
случай, задача формировалась бы иначе.


Я еще вернусь, Nickita... Удачи.

Nickita A Startcev

unread,
Nov 16, 2006, 5:27:18 AM11/16/06
to
Привет, Andrew !


16 Nov 06 , 00:27 Andrew Kuksov писал к Nickita A Startcev:

VI>>>> 1) как "перевернуть" байт ?
VI>>>> те изначально биты расположены 0,1,..7
VI>>>> нужно получить байт с битами 7,6,..0
VI>>>> интересует алгоритм (код на c++)
AK>>> Думаю, что использовать таблицу - достаточно эффективный способ.
AK>>> Быстро и просто.
NAS>>
NAS>> u8 src;
NAS>> u8 dest;
NAS>> ...
NAS>> dest = ( src >> 1 ) | ( ( src << 7 ) % 0x1;
NAS>> если хочется на си.

AK> И что получилось?

Циклический сдвиг.
Исходный вопрос невнимательно просмотрел.

dest = ((src & 1)<<7) | ((src & 2)<<5) | ((src & 4)<<3) | ((src & 8)<<1) |
((src & 16)>>1) | ((src & 32)>>3) | ((src & 64)>>5) | ((src & 128)>>7);

. С уважением, Hикита.
... Hикого скромнее нет наашего Хасана..

Andrey Hlus

unread,
Nov 20, 2006, 7:16:21 AM11/20/06
to
Я пишу Вам, Nickita, и одновременно, глоток за глотком, наслаждаюсь
чудесным напитком.

NS> Циклический сдвиг.
NS> Исходный вопрос невнимательно просмотрел.

NS> dest = ((src & 1)<<7) | ((src & 2)<<5) | ((src & 4)<<3) | ((src &
NS> 8)<<1) | ((src & 16)>>1) | ((src & 32)>>3) | ((src & 64)>>5) | ((src &
128)>>> 7);

Упасть не встать. Интересно, а что сгенерит на это компилятор? Поскольку к Си
равнодушен, то вот мой вариант на асме, а на С/С++ переведешь уж сам, только
наврядли у тебя это получится ;-)
mov al,[inbyte]
mov dl,al
and al,33h
xor dl,al
rol al,4
or al,dl
mov dl,al
and al,55h
xor dl,al
rol al,2
or al,dl
ror al,7 ; al - результат

ИМХО один из редких случаев, когда выигрываешь и по скорости и по размеру ;-)

NS> Таблица, если хочется извратнуться.

А что, все программисты извращенцы?


Best regards...
Andrey "Zag Station".

Dmitry Grebeniuk

unread,
Nov 23, 2006, 4:09:44 AM11/23/06
to
hi, Andrey

AH> Поскольку к Си равнодушен, то вот мой вариант на асме

бугога

AH> , а на С/С++ переведешь уж сам, только наврядли у тебя это получится
AH> ;-)

гыгыгы

AH> А что, все программисты извращенцы?

В основном когда они осемблирщики.

bye

Nickita A Startcev

unread,
Nov 23, 2006, 9:56:14 AM11/23/06
to
Привет, Andrey !


20 Nov 06 , 15:16 Andrey Hlus писал к Nickita A Startcev:

AH> Интересно, а что сгенерит на это компилятор?

0: 48 2f mov r20, r24
2: 55 27 eor r21, r21
4: 24 2f mov r18, r20
6: 35 2f mov r19, r21
8: 21 70 andi r18, 0x01 ; 1
a: 30 70 andi r19, 0x00 ; 0
c: 36 95 lsr r19
e: 32 2f mov r19, r18
10: 22 27 eor r18, r18
12: 37 95 ror r19
14: 27 95 ror r18
16: 95 2f mov r25, r21
18: 84 2f mov r24, r20
1a: 82 70 andi r24, 0x02 ; 2
1c: 90 70 andi r25, 0x00 ; 0
1e: 88 0f add r24, r24
20: 99 1f adc r25, r25
22: 82 95 swap r24
24: 92 95 swap r25
26: 90 7f andi r25, 0xF0 ; 240
28: 98 27 eor r25, r24
2a: 80 7f andi r24, 0xF0 ; 240
2c: 98 27 eor r25, r24
2e: 28 2b or r18, r24
30: 95 2f mov r25, r21
32: 84 2f mov r24, r20
34: 84 70 andi r24, 0x04 ; 4
36: 90 70 andi r25, 0x00 ; 0
38: 88 0f add r24, r24
3a: 99 1f adc r25, r25
3c: 88 0f add r24, r24
3e: 99 1f adc r25, r25
40: 88 0f add r24, r24
42: 99 1f adc r25, r25
44: 28 2b or r18, r24
46: 95 2f mov r25, r21
48: 84 2f mov r24, r20
4a: 88 70 andi r24, 0x08 ; 8
4c: 90 70 andi r25, 0x00 ; 0
4e: 88 0f add r24, r24
50: 99 1f adc r25, r25
52: 28 2b or r18, r24
54: 95 2f mov r25, r21
56: 84 2f mov r24, r20
58: 80 71 andi r24, 0x10 ; 16
5a: 90 70 andi r25, 0x00 ; 0
5c: 95 95 asr r25
5e: 87 95 ror r24
60: 28 2b or r18, r24
62: 95 2f mov r25, r21
64: 84 2f mov r24, r20
66: 80 72 andi r24, 0x20 ; 32
68: 90 70 andi r25, 0x00 ; 0
6a: 95 95 asr r25
6c: 87 95 ror r24
6e: 95 95 asr r25
70: 87 95 ror r24
72: 95 95 asr r25
74: 87 95 ror r24
76: 28 2b or r18, r24
78: 95 2f mov r25, r21
7a: 84 2f mov r24, r20
7c: 80 74 andi r24, 0x40 ; 64
7e: 90 70 andi r25, 0x00 ; 0
80: 95 95 asr r25
82: 87 95 ror r24
84: 95 95 asr r25
86: 87 95 ror r24
88: 95 95 asr r25
8a: 87 95 ror r24
8c: 95 95 asr r25
8e: 87 95 ror r24
90: 95 95 asr r25
92: 87 95 ror r24
94: 28 2b or r18, r24
96: 44 0f add r20, r20
98: 45 2f mov r20, r21
9a: 44 1f adc r20, r20
9c: 55 0b sbc r21, r21
9e: 51 95 neg r21
a0: 24 2b or r18, r20
a2: 82 2f mov r24, r18
a4: 99 27 eor r25, r25
a6: 08 95 ret

AH> А что, все программисты извращенцы?

Hет. только assемблероманы изобретающие странные алгоритмы.

. С уважением, Hикита.
... Дать взятку в Американский минюст и запретить Микрософт? :)

Michael Mamaev

unread,
Nov 24, 2006, 1:09:27 PM11/24/06
to
Веpишь ли Вы в жизнь после топки, Nickita?
Четвеpг Hоябpь 23 2006 17:56, Nickita A Startcev wrote to Andrey Hlus:

AH>> А что, все пpогpаммисты извpащенцы?
NS> Hет. только assемблеpоманы изобpетающие стpанные алгоpитмы.

Как pаз алгоpитм y него вполне годный, относительно эхотажный.


Майкл

Nickita A Startcev

unread,
Nov 25, 2006, 6:34:06 AM11/25/06
to
Привет, Michael !


24 Nov 06 , 21:09 Michael Mamaev писал к Nickita A Startcev:

AH>>> А что, все пpогpаммисты извpащенцы?
NS>> Hет. только assемблеpоманы изобpетающие стpанные алгоpитмы.

MM> Как pаз алгоpитм y него вполне годный, относительно эхотажный.

А в какой области он может понадобиться?
result=table[src] вроде как быстрее и короче по коду.

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev
... юркие е-стеренки и i-стероиды

Michael Mamaev

unread,
Nov 26, 2006, 4:07:44 AM11/26/06
to
Веpишь ли Вы в жизнь после топки, Nickita?
Сyббота Hоябpь 25 2006 14:34, Nickita A Startcev wrote to Michael Mamaev:

NS>>> Hет. только assемблеpоманы изобpетающие стpанные алгоpитмы.
MM>> Как pаз алгоpитм y него вполне годный, относительно эхотажный.

NS> А в какой области он может понадобиться?
Именно этот алгоpитм или пеpестановка битов вообще?

NS> result=table[src] вpоде как быстpее и коpоче по кодy.
Ты сам вместо этого что пpивёл? :)

По кодy то коpоче, а по памяти сильно толще. А если бы это был не байт?


Майкл

Nickita A Startcev

unread,
Nov 27, 2006, 7:20:34 AM11/27/06
to
Привет, Michael !


26 Nov 06 , 12:07 Michael Mamaev писал к Nickita A Startcev:

NS>>>> Hет. только assемблеpоманы изобpетающие стpанные алгоpитмы.
MM>>> Как pаз алгоpитм y него вполне годный, относительно эхотажный.
NS>> А в какой области он может понадобиться?

MM> Именно этот алгоpитм или пеpестановка битов вообще?

NS>> result=table[src] вpоде как быстpее и коpоче по кодy.

MM> Ты сам вместо этого что пpивёл? :)

наСИльную развертку таблицы. :)

MM> По кодy то коpоче, а по памяти сильно толще. А если бы это был не
MM> байт?

Тогда бы по каждому байту таблица. Hу или опять полное развертывание.

. С уважением, Hикита.

Andrey Hlus

unread,
Dec 9, 2006, 6:36:01 PM12/9/06
to
Я пишу Вам, Nickita, и одновременно, глоток за глотком, наслаждаюсь
чудесным напитком.


NS> А в какой области он может понадобиться?
NS> result=table[src] вроде как быстрее и короче по коду.

Кстати говоря, на современных процах применение таблицы не даст большого
выигрыша по скорости, из-за лишнего обращения к памяти, да и кэш не резиновый
;-)

MM>> По кодy то коpоче, а по памяти сильно толще. А если бы это был не
MM>> байт?

NS> Тогда бы по каждому байту таблица.

А в данном примере достаточно заменить регистры, и добавить пару инструкций ;-)

NS> Hу или опять полное развертывание.

А юзера, который будет пользоваться этой программой не жалко? Это же по объему
таблицу обставит ;-)

Reply all
Reply to author
Forward
0 new messages