Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Rotiranje 8 bita u desno za 3 mesta u C

[es] :: C/C++ programiranje :: C/C++ za početnike :: Rotiranje 8 bita u desno za 3 mesta u C

Strane: 1 2

[ Pregleda: 6198 | Odgovora: 30 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

HeplF2
Mika Petrov
Beograd

Član broj: 331020
Poruke: 61
*.dynamic.isp.telekom.rs.



+1 Profil

icon Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 14:57 - pre 99 meseci
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.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.ip.telfort.nl.



+7173 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 15:48 - pre 99 meseci
>> 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.
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

HeplF2
Mika Petrov
Beograd

Član broj: 331020
Poruke: 61
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 16:34 - pre 99 meseci
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.
 
Odgovor na temu

HeplF2
Mika Petrov
Beograd

Član broj: 331020
Poruke: 61
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 16:39 - pre 99 meseci


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

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

ali nije radilo

 
Odgovor na temu

HeplF2
Mika Petrov
Beograd

Član broj: 331020
Poruke: 61
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 16:41 - pre 99 meseci
ustvari radi :)))))))))))))

ali zbunjuje me to sto kada rotiram i siftujem dobijem isti rezultat pomeranja?
 
Odgovor na temu

HeplF2
Mika Petrov
Beograd

Član broj: 331020
Poruke: 61
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 17:08 - pre 99 meseci
probao sam opet kombinaciju 1000 1110 =8F za tri u desno ali ne radi kako treba
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 17:13 - pre 99 meseci
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));
 
 
Odgovor na temu

HeplF2
Mika Petrov
Beograd

Član broj: 331020
Poruke: 61
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 17:42 - pre 99 meseci
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
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 17:51 - pre 99 meseci
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).
 
Odgovor na temu

HeplF2
Mika Petrov
Beograd

Član broj: 331020
Poruke: 61
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 17:57 - pre 99 meseci
Nazalost, opet isti pogresan rezultat. Upravo sam proverio
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 17:58 - pre 99 meseci
Nema teorije da ovo ne radi:
((x>>3)&0x1f) | (x<<5)
 
Odgovor na temu

HeplF2
Mika Petrov
Beograd

Član broj: 331020
Poruke: 61
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 18:06 - pre 99 meseci
Ja sam napisao ((x>>3)&0x1f) | (x<<5) i displej ocitao stanje dioda i dobijem 1111 0001 a treba 1101 0001
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 18:26 - pre 99 meseci
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$
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 18:38 - pre 99 meseci
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$ 

 
Odgovor na temu

HeplF2
Mika Petrov
Beograd

Član broj: 331020
Poruke: 61
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 20:02 - pre 99 meseci
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
 
Odgovor na temu

HeplF2
Mika Petrov
Beograd

Član broj: 331020
Poruke: 61
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 20:07 - pre 99 meseci
OPROSTI..
EVO PRORADILO JE ..Nisam na drugom mestu stavio 8e pa zato....
Sve ok ,radi kako treba.
Izvinjavam se za pogresno ubedjivanje
 
Odgovor na temu

HeplF2
Mika Petrov
Beograd

Član broj: 331020
Poruke: 61
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 20:21 - pre 99 meseci
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..
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C09.02.2016. u 21:29 - pre 99 meseci
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".
 
Odgovor na temu

HeplF2
Mika Petrov
Beograd

Član broj: 331020
Poruke: 61
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C10.02.2016. u 07:55 - pre 99 meseci
Znaci stavim samo zagrade{} ?


To kad stavim opet ne radi, promenljiva i je definisana u zaglavlju kao byte i=0;
 
Odgovor na temu

plague
Software Developer
Auckland, NZ

Član broj: 46734
Poruke: 623
*.136.4.181.host.layer2.co.nz.



+373 Profil

icon Re: Rotiranje 8 bita u desno za 3 mesta u C10.02.2016. u 21:16 - pre 99 meseci
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.
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Rotiranje 8 bita u desno za 3 mesta u C

Strane: 1 2

[ Pregleda: 6198 | Odgovora: 30 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.