Rozdělení 16-ti bitového čísla

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod wolt 29. 3. 2010 21:28

Dobrý den, potřebuji poradit. Programuji v C. Mám 16 bitové číslo, ale paměť, do které lze ukládat jen po 8 bitech. Lze 16 bitové číslo nějak rozdělit na 2 čísla 8 bitová a pak po přečtení opět spojit? :-|
wolt
Kolemjdoucí

Odeslat příspěvekod Vebloud 29. 3. 2010 21:40

A s čím konkrétně máš problém? Je to celé číslo, nebo float? Celé číslo lze rozdělit na 8 bitů snadno. Prvních 8 bitů do jedné buňky a druhých do druhé a dokonce se sním i snadno i počítá, protože stačí hlídat přetečení a přičíst ho do vyššího bytu. S rozdělením floatu je to stejné, akorát s tím pak v té paměti nejde tak snadno počítat.
Žít a nechat žít, ty máš svůj názor, já mám svůj názor, já ti nebudu nutit svůj, nemusím souhlasit s tvým, ale udělám vše, abys ho mohl svobodně vyjádřit.
Vebloud
Ex-moderátor
Uživatelský avatar

Odeslat příspěvekod Nargon 29. 3. 2010 21:48

Mno tohle by mohlo fungovat jsou to jednoduche bitove operace AND, OR a posun.
Kód: Vybrat vše
unsigned char 1Byte, 2Byte;

void uloz(short s){
  1Byte = (unsigned char)(s&0x00ff);
  2Byte = (unsigned char)((s>>8)&0x00ff);
}

short nacti(){
  short s = 0;
  s|=1Byte;
  s|=2Byte<<8;
  return s;
}


P.S. psal jsem to z hlavy, kdyby to nefungovalo tak me neukamenujte.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod soban 29. 3. 2010 22:57

Jaká paměť ?

V C je int a to je většinou 16b, a ram i zařízení se dá taky adresovat po 16b takže by to chtělo trochu vysvětlit o co se snažíš.
/----------------------------------------\
| Petr Šobáň |
| Olomouc |
\----------------------------------------/
soban
Pokročilý

Odeslat příspěvekod wolt 29. 3. 2010 23:01

Jedná se o celé číslo(3000), které nějakým způsobem získám, pak ho uložím a po nějaké době opět použiju. S tímto uloženým číslem nebudu provádět žádné početní operace. Potřebuji toto 16 bitové číslo fakt jen uložit do paměti s ukládáním po 8 bitech a opět přečíst.
wolt
Kolemjdoucí

Odeslat příspěvekod soban 29. 3. 2010 23:09

A co tě brání si alokovat v ram proměnnou typu int ?
/----------------------------------------\
| Petr Šobáň |
| Olomouc |
\----------------------------------------/
soban
Pokročilý

Odeslat příspěvekod wolt 29. 3. 2010 23:26

Jedná se o paměť RAM v PIC16F877A dělenou na banky.
wolt
Kolemjdoucí

Odeslat příspěvekod Nargon 29. 3. 2010 23:54

Ja bych mel takovou otazecku. A od kdy se 8bitove mikropocitace programuji v Cecku? tohle se snad vzdy pise v assembleru.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod Vebloud 30. 3. 2010 00:01

Už jsem taky nějáký microcontroller v C taky programoval a dokonce se používá i C#.
Žít a nechat žít, ty máš svůj názor, já mám svůj názor, já ti nebudu nutit svůj, nemusím souhlasit s tvým, ale udělám vše, abys ho mohl svobodně vyjádřit.
Vebloud
Ex-moderátor
Uživatelský avatar

Odeslat příspěvekod jsmach 30. 3. 2010 05:50

už tě chápu, tobě jde o rozdělení čísla 3000 na 2 8bit čísla, takže:

3000:256= v celé části je horní byte
zbytek za desetinnou tečkou * 256 je dolní byte

(3000/256= 11,71875 tj. horní (vyšší) byte = 11
0,71875x256=184 tj. spodní (nižší) byte = 184)

ale to jsou zklady, které by jsi měl znát!!!
jsmach
Junior

Odeslat příspěvekod soban 30. 3. 2010 10:23

Ale i pro jednočipy se dá použít C a i tam se snad dá použít int na uložení do ram a překladač to snad sám rozdělí a uloží do dvou buněk, pouze dávat pozor aby jsi tu druhou část nepřepsal.

Asi by bylo vhodné ten kousek kodu zveřejnit a možná ti poradíme elegantní spůsob jako to zapsat.

Jinak jak rozdělit číslo ti už v C napsal o pár příspěvků víš nargon.
/----------------------------------------\
| Petr Šobáň |
| Olomouc |
\----------------------------------------/
soban
Pokročilý

Odeslat příspěvekod Vebloud 30. 3. 2010 13:02

Já bych si tipnul, že se jedná o uložení do nějáké externí paměti připojené na některý z portů onoho jednočipu. A vypadá to jako školní úloha.
Žít a nechat žít, ty máš svůj názor, já mám svůj názor, já ti nebudu nutit svůj, nemusím souhlasit s tvým, ale udělám vše, abys ho mohl svobodně vyjádřit.
Vebloud
Ex-moderátor
Uživatelský avatar

Odeslat příspěvekod KinDo 28. 7. 2010 14:13

OT
Nargon píše:
Kód: Vybrat vše
unsigned char 1Byte, 2Byte;

void uloz(short s){
  1Byte = (unsigned char)(s&0x00ff);
  2Byte = (unsigned char)((s>>8)&0x00ff);
}

short nacti(){
  short s = 0;
  s|=1Byte;
  s|=2Byte<<8;
  return s;
}



z hlavy celkom ujde :)
akurat procedure 'uloz' by som dal parameter 'unsigned short'
a vo funkcii 'nacti' premenna '2Byte' "vytecie", ak ju 8x posunies - je to byte ( ale neviem, aka je priorira operatorov - ak ma '|=' vyssiu prioritu, tak je to OK )
takze asi tiez riesit parametrami typu 'unsigned short int'

kompilovane tiez z hlavy :)
KinDo
Junior

Odeslat příspěvekod IgnorStoupa 28. 7. 2010 14:49

Nebo to udelam ve FORTRANu pres EKVIVALENCE - cislo normalne ulozim jako interger*2 a pak na stejne misto pameti namapuju dva 8bitove char textove znaky....ktere pak prepisu do dolnich casti jinych dvou integer*2 s ekvivalenci na tetove znaky s tim, ze horni znak je nulovy ... pak zpetne pres EKVIVALENCI ctu jako dve integer*2 cisla ...jen bacha, v jakem poradi se ty dva byte fyzicky zapisuji. :mrgreen:
Proc to delat slozite kdyz to jde takhle jednoduse :twisted:
Neni dano vubec nic. Sestrojte parabolu.
IgnorStoupa
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod KinDo 28. 7. 2010 14:56

OT2
spravna pripomienka
big a little endian sa tu este neriesil ;)
KinDo
Junior

Další stránka

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků