[ HeplF2 @ 09.02.2016. 14:57 ] @
Da li moze ovako

(x & 0xFF)>>3 ;

da se rotira npr promenljiva koja sadrzi 8 bita, tj x=0XFF ???

Ili je to i dalje siftovanje?

Posto nije isto kada siftuje samo sa >> i rotacija.
[ Ivan Dimkovic @ 09.02.2016. 15:48 ] @
>> je operacija pomeranja u desno, bitovi koji "ispadnu" nece biti rotirani.

Na zalost, C / C++ nemaju operacije rotiranja, vec samo pomeranja.

Za rotaciju ces morati da napises makro ili f-ju, recimo mozes koristiti jednu od ovih:

https://en.wikipedia.org/wiki/Circular_shift

Budi oprezan sa tim kako deklarises promenljivu x (int je 32-bitne velicine), za 8-bitne promenljive ces morati izmeniti prvu varijantu iz linka gore.
[ HeplF2 @ 09.02.2016. 16:34 ] @
Hvala ti puno na odgovoru.
Bar znam da ne mogu tako.
Gledao sam to na wiki ali to mi je suvise komplikovano.
Treba mi jednostavna operacija posto radim nesto za izbacivanje vrednosti na displej za mikrokontroler. Cisto da vidim da li rotira led diode ...

Mislim da postoji neki naci i sa pokazivacem ali ne znam kako ..

U sustini x je promenljiva koja sadrzi osam bita i to sada treba rotirati i nista vise.
Mnogi brkaju siftovanje i rotiranje te ih spajaju zajedno pa vise ne znam koja operacija je validna.
[ HeplF2 @ 09.02.2016. 16:39 ] @


Pobao sam da iskoristim ovaj deo (value>>count) | (value<<( (-count) & mask ));

kao (x>>3) | (x<<( (-3) & 0xFF ));

ali nije radilo

[ HeplF2 @ 09.02.2016. 16:41 ] @
ustvari radi :)))))))))))))

ali zbunjuje me to sto kada rotiram i siftujem dobijem isti rezultat pomeranja?
[ HeplF2 @ 09.02.2016. 17:08 ] @
probao sam opet kombinaciju 1000 1110 =8F za tri u desno ali ne radi kako treba
[ djoka_l @ 09.02.2016. 17:13 ] @
U stvari ne radi.
Treba umesto 0xFF da stoji 0x07 (ili samo 7).

Početni broj je:

rotacijom u desno za 3 mesta bi trebalo da se dobije broj:

šift u desno za tri mesta daje broj:

Znači problem su prve tri cifre.
Šift u LEVO za 5 mesta daje broj:


OR ova dva rezultata (operacija |) daje željeni rezultat

E, sada zašto ovo radi?
Broj -3 u drugom komplementu dužine 16 bitova je 1111 1111 1111 1101. Kada se uradi & 7 (7 je 0000 0000 0000 0111), rezultat je 5 (0000 0000 0000 0101).

znači treba:
Code (c):

(x>>3) | (x<<5);
 

ili
Code (c):

(x>>3) | (x<<(-3 & 7));
 

ili
Code (c):

(x>>3) | (x<<(8-3));
 
[ HeplF2 @ 09.02.2016. 17:42 ] @
Ako uzmem kombinaciju 1000 1110 sto je 8E u hexa i pomerim za tri mesta u desno po ovome (x>>3) | (x<<5); dobijam 1111 0001 na displeju sto nije tacno

a treba da dobijem 1101 0001.

Displej je niz od osam led dioda i idu redom onako kako si napisao za a7 .... a1
[ djoka_l @ 09.02.2016. 17:51 ] @
aha, treba logički shift (>>>) a ne aritmetički (>>)
Ako nemaš logički shift, onda ((x>>3)&0x1f) | (x<<5)

Na C bi morao da radi >> za unsigned. Ako ti je x signed, onda se desnim šiftom ne ubacuju nule s leva nego ona cifra koja je skroz levo (u tvom slučaju 1).
[ HeplF2 @ 09.02.2016. 17:57 ] @
Nazalost, opet isti pogresan rezultat. Upravo sam proverio
[ djoka_l @ 09.02.2016. 17:58 ] @
Nema teorije da ovo ne radi:
((x>>3)&0x1f) | (x<<5)
[ HeplF2 @ 09.02.2016. 18:06 ] @
Ja sam napisao ((x>>3)&0x1f) | (x<<5) i displej ocitao stanje dioda i dobijem 1111 0001 a treba 1101 0001
[ djoka_l @ 09.02.2016. 18:26 ] @
Code (c):

#include <stdio.h>

int main()
{
    char hex[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
    unsigned char x = 0x8e;
   
    printf ("0x%c%c\n", hex[(x&0xf0)>>4], hex[x&0x0f]);
   
    x= ((x>>3)|(x<<5));
   
    printf ("0x%c%c\n", hex[(x&0xf0)>>4], hex[x&0x0f]);
    return 0;
}
 

Code:

sh-4.3$ gcc -o main *.c                                                                                                                                         
sh-4.3$ main                                                                                                                                                    
0x8e                                                                                                                                                            
0xd1                                                                                                                                                            
sh-4.3$
[ djoka_l @ 09.02.2016. 18:38 ] @
ovako radi pogrešno (sa signed)
Code (c):

#include <stdio.h>

int main()
{
    char hex[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
    signed char x = 0x8e;
   
    printf ("0x%c%c\n", hex[(x&0xf0)>>4], hex[x&0x0f]);
   
    x= ((x>>3)|(x<<5));
   
    printf ("0x%c%c\n", hex[(x&0xf0)>>4], hex[x&0x0f]);
    return 0;
}
 

Code:

sh-4.3$ gcc -o main *.c                                                                                                                                         
sh-4.3$ main                                                                                                                                                    
0x8e                                                                                                                                                            
0xf1                                                                                                                                                            
sh-4.3$                                                                                                                                                         


ali ako uradiš ovako opet radi
Code (c):

#include <stdio.h>

int main()
{
    char hex[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
    signed char x = 0x8e;
   
    printf ("0x%c%c\n", hex[((x&0xf0)>>4)&0x0f], hex[x&0x0f]);
   
    x= (((x>>3)&0x1f)|(x<<5));
   
    printf ("0x%c%c\n", hex[((x&0xf0)>>4)&0x0f], hex[x&0x0f]);
    return 0;
}
 

Code:

sh-4.3$ gcc -o main *.c                                                                                                                                         
sh-4.3$ main                                                                                                                                                    
0x8e                                                                                                                                                            
0xd1
sh-4.3$ 

[ HeplF2 @ 09.02.2016. 20:02 ] @
Dobro ali kod mene ne radi. Ja nema printf opciju-posto se radi za mikrokontroler . Ja samo treba da stavi na displej vrednost . Znaci tu operaciju izjednacim sa memorijski mapiranom promenljivom displej
[ HeplF2 @ 09.02.2016. 20:07 ] @
OPROSTI..
EVO PRORADILO JE ..Nisam na drugom mestu stavio 8e pa zato....
Sve ok ,radi kako treba.
Izvinjavam se za pogresno ubedjivanje
[ HeplF2 @ 09.02.2016. 20:21 ] @
Hteo bih sada da pitam da li znate mozda kako bi se moglo napisati provera u cetiri niza koliko ima elemenata manjih od npr sest,da izbroji u svakom nizu.

Ja sam glavni deo programa zamislio ovako (krece od FOR)

Code:


byte niz1[16]={3,22,31,9,11,6,7,8,23,17,10,30,73,40,55,93};
 byte niz2[16]={11,14,7,13,17,19,97,2,12,128,1,124,123,122,33,21};
  byte niz3[16]={9,15,4,13,2,49,57,3,74,47,39,59,112,100,91,6};
   byte niz4[16]={33,58,68,66,21,19,97,3,1,2,5,12,27,9,15,11};
byte count1=0,count2=0,count3=0,count4=0;
a= niz1[i];
b= niz2[i];
c= niz3[i];
 d= niz4[i];

for (i=0;i<16;i++){
                           if(a<6) count1++;
                                displej=count1 ;

                           if(b<6) count2++;
                            displej=count2;
                           if(c<6) count3++;
                          displej=count3;
                           if(d<6) count4++;
                           displej=count4;  }



ali to ne radi .. Nece da mi proveri za svaki. E sada da li postoji opcija da uradim sa 4 for petlje? I kako ???????

Znaci interesuje me samo taj deo za proveru i ispis..
[ djoka_l @ 09.02.2016. 21:29 ] @
Pa ne valja, mora u petlji da se proverava

Code:
if(niz1[i]<6) count1++;
...

a ne da se van petlje dodeli vrednost nekoj promenljivoj, pa da se stalno proverava ta ista vrednost.
Nije mi uopšte jasno kako tvoj primer uopšte i može da se kompajlira, kada se promenljivoj a dodeljuje element niza PRE nego što je deklarisana i inicijalizovana varaijabla "i".
[ HeplF2 @ 10.02.2016. 07:55 ] @
Znaci stavim samo zagrade{} ?


To kad stavim opet ne radi, promenljiva i je definisana u zaglavlju kao byte i=0;
[ plague @ 10.02.2016. 21:16 ] @
Ne treba da stavis zagrade nego da pomeris deo gde dodeljujes vrednost a, b, c, d da bude unutar for petlje.

Cilj ti je da u for petlji koja ce se izvrsiti 16 puta, svaki put dohvatis novi element zavisno od trenutnog indexa i.
Dakle dodeljivanje vrednosti a, b, c, d treba da se izvrsi svaki put kada petlja krene u novi ciklus izvrsavanja.
[ HeplF2 @ 10.02.2016. 21:29 ] @
Jasno ,ali ne znam kako to da uradim?
[ HeplF2 @ 10.02.2016. 21:32 ] @
Mislio sam da uzmem 4 for petlje . Tj za svaki niz posebno ali to ne radi.. probao sam..
Ne mogu bez if uslova jer treba da poredi koji je manji broj a jedino da ispis izdvojim iz if petljje a da u ifu samo broji sa count++???
[ plague @ 11.02.2016. 00:08 ] @
Sto se mene tice mozes copy/paste ili mozes prekucas, kako god hoces. :)

Probaj prvo da napises presudo kodom sta zelis da postignes jer mislim da ne razumes potpuno kako stvari funkcionisu.
Evo ti primer kako bi pseudo kod izgledao:

Code:

niz1
brojac1
duzinaNiza

od 0 do duzinaNiza-1 {
    treutniElement 
    ako je treutniElement < 6
        brojac1++
}


Definicija trenutniElement treba da bude unutar petlje. Tebi to nedostaje, tj definises trenutni element van petlje sto dovodi do toga da se trenutni element nikada ne menja kada napreduje petlja.
[ HeplF2 @ 11.02.2016. 07:55 ] @
STa trenutni element ? Mislis na i=0.
Ili mislis na 16 if uslova pa da pisem i za svaki trenutni element?




[ Rapaic Rajko @ 11.02.2016. 08:00 ] @
Prvo savladati osnove C-a, pa se onda dohvatiti mikrokontrolera i dioda... aman.

Pozz
[ HeplF2 @ 11.02.2016. 09:11 ] @
Hvala. Divni ste.
[ Rapaic Rajko @ 11.02.2016. 12:40 ] @
HeplF2, NHF (ne ljuti se, covek).

Vidi, zbog tvog NErazumevanja materije (cak i tako elementarne kao sto su petlje), tvoja su pitanja nama koji nesto znamo nesuvisla. Da bih shvatio sta ti zapravo pitas, procitam odgovor kolege ispod i tek onda ukapiram sta si hteo/pitao. A kolega koji ti je odgovorio je ulozio NEMALI napor da skonta kako ti razmisljas, sta pitas i gde gresis.
Tako da, ako hoces pomoc, prvo poradi na sebi i postavljanju pitanja. Evo za pocetak, ulozi i ti malo truda i detaljno procitaj odgovore koje su ti pisali ljudi ovde. Sve sto treba za resenje problema, dobio si. Zato ti vise niko i ne odgovara; sad je sve na tebi.

Pozz

[ HeplF2 @ 11.02.2016. 14:23 ] @
Ovako, ajde posto svi volite da kuckate.. Evo kuckacemo :)))

Prvo, upao sam u temu za pocetnike . Sto nije greska sa moje strane.

DRugo, u tom slucaju normalno je da cu postaviti elementarna pitanja.

Trece, zadatak nije trivijalan iako se cini. Ovde se ne radi o jednom nizu pa da protrci kroz njega i kraj .. Ovde ima cetiri niza. i kroz svaki treba posebno da radi i da izbaci na displej.

Mene intresuje kako se radi kada ima vise nizova. Nije mi to jasno.. Hvala svima na odgovorima al ja vas ne kontam ..
Mnogo ste nedoreceni. A niste nista posebno napisali. Naravno da konta neko ko je to vec radio i da je sada kao sve receno a ja sam lenj da razmisljam
. Ja to nisam radio i ne kontam slozenije primere.

Ja ne trazim da mi neko uradi zadatak. A plus to nije ceo zadatak, to je samo delic..



Nisam ljut.
Ne morate vise nista pisati. Vi ste pisali,hteli ste da pomognete,ja ne razumem i gotovo.

Idem na strani forum.
[ jablan @ 11.02.2016. 14:41 ] @
Puno sreće na stranom forumu.

Poenta je - ako još imaš problem sa konceptima kao što su petlje i scope promenljivih, treba da batališ mikrokontrolere i svoj kod izvršavaš na svom računaru, uz dosta debagiranja, da vidiš koja promenljiva kada ima koju vrednost itd.

Takođe, treba urednije da pišeš kod, da poštuješ pravila indentacije i umetanja spejsova tamo gde treba. Sebe radi i drugih radi.
[ Rapaic Rajko @ 12.02.2016. 08:32 ] @
Citat:
HeplF2:
Trece, zadatak nije trivijalan iako se cini. Ovde se ne radi o jednom nizu pa da protrci kroz njega i kraj .. Ovde ima cetiri niza. i kroz svaki treba posebno da radi i da izbaci na displej.


... (ne znam sta bih vise rekao )

Pozz


[Ovu poruku je menjao Rapaic Rajko dana 12.02.2016. u 11:43 GMT+1]
[ Mihajlo Cvetanović @ 13.02.2016. 00:14 ] @
Ako četiri niza nije trivijalno, a jedan jeste onda uradi sa jednim nizom. Po načinu na koji si predstavio problem nama se čini da ti i sa jednim nizom neće biti trivijalno. Probaj prvo sa jednim nizom da rešiš problem, pa ako bude teško zapomagaj. Ako si rešio problem sa jednim nizom onda nam pokaži ovde kako si ga rešio, da vidimo.