"Mešanje" bitov

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

"Mešanje" bitov

OdgovorNapisal/-a Kroko » 18 Dec 2016, 13:00

Rad bi čim hitreje premetal bite v drugo zaporedje.

Koda: Izberi vse
uint8 order[16] = {2, 1, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}

uint16_t value = 12345;
uint16_t result = 0;

for (int i=0; i<16; i++)
{
   result |= ((value>>order[i]) & 1) << i;
}


Kakšna ideja?
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4771
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1647 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: "Mešanje" bitov

OdgovorNapisal/-a mujo » 18 Dec 2016, 13:36

Tabela (result = tabela[value]) :)
V primeru je efekt algoritma na spodnje 4 bite - tabela ti je potem kar majhna.
Ampak predvidevam, da dejanski vrstni red bo razmesal tudi ostale bitke.
Se zmeraj mislim, da je tabela hitra rešitev. Za primer si poglej računanje CRC preko tabel.
Zadnjič spremenil mujo, dne 18 Dec 2016, 13:40, skupaj popravljeno 1 krat.
mujo
 
Prispevkov: 734
Pridružen: 21 Jan 2015, 10:50
Kraj: MB
Zahvalil se je: 1 krat
Prejel zahvalo: 150 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 18

Re: "Mešanje" bitov

OdgovorNapisal/-a zanka » 18 Dec 2016, 13:36

Da, recimo, da imam preslikavo X "order," ki mi pove izvor ciljnega bita. Primer X[16] -> 5 pomeni, da se bo na koncu na 16 mestu pojavil 5 bit.
Najprej pogledam, kateri bit bo končal na 16 mestu.
Koda: Izberi vse
if ( value & (1 << X[16]) )
r |= 1;

In potem bit prestavim za eno v levo.
Koda: Izberi vse
r <<= 1;

Sedaj nastavim 15 bit.
Koda: Izberi vse
if ( value & (1 << X[15]) )
r |= 1;

in zopet zamaknem.

A bi to bilo?
Uporabniški avatar
zanka
 
Prispevkov: 2567
Pridružen: 17 Mar 2016, 01:16
Zahvalil se je: 113 krat
Prejel zahvalo: 254 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 50


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost