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

maskiranje i promena vrednosti na nivou bita

[es] :: C/C++ programiranje :: C/C++ za početnike :: maskiranje i promena vrednosti na nivou bita

[ Pregleda: 1416 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Konstantin91
Konstantin Petrovic
Mladenovac

Član broj: 57918
Poruke: 168
*.bitinfo.rs.



+34 Profil

icon maskiranje i promena vrednosti na nivou bita26.04.2011. u 23:43 - pre 98 meseci
Evo imam jedan zadatak na viseru, lepo objasnjen kod ali ne znam iz kog razloga zabo sam na ovom zadatku pa ako moze neko detaljnije da mi objasni. Mi smo vec presli ove zadatke ali ne znam iz kog razloga na zadacima ovog tipa "zabadam" pa ako neko moze da mi pojasni:
#include <stdio.h>
main ()
{
unsigned short x,n
printf("\nunesite jedan pozitivan ceo broj u heksadecimalnom obliku");
printf("\nopseg broja: do 0xffff");
scanf("%x, &x");

printf("\nUnesite redni broj bita koji se ispituje od 1 do 16");
scanf("%d, &n");

if(x & (1<<(n-1)))
printf("\n %d bit zadatog podatka ima vrednost 1",n);

else
printf("\n %d bit zadatog podatka ima vrednost 0",n);

x^=(1<<(n-1));

printf("\nVrednost %d bita zadatog podatka je nepromenjena",n);
printf("nova vrednost zadatog podatka je %#x\n\n",x);
}



Ako neko moze da mi pojasni, naravno znam sta je printf scanf.... koliko sam ja nesto shvatio ovde on ubacuje 1 na mesto bita koji se ispituje i radi logicko mnozenje (rezultat je 1 samo kada su obe vrednosti 1)... e sada ja ne kapiram malo ovaj kod, jel on ubacuje 1 na svaki bit posebno pa da bi presao na naredni,on onaj vec obrajdeni siftuje u levo ali opet ne shvatam.... znam da je ovo prosto ali ja nekako ovde zabadam, ne znam zasto. Da napomenem, znam sta rade operatori & i | (logicko mnozenje i sabiranje) ali ne kapiram na koji nacin ispituje bitove kod unetog heksadecimalnog koda i ne kapiram sta poslednja naredba sa x radi....
radio sam u asembleru pre godinu dana i mislim da bih tamo lakse ovo izveo nego ovde (sa 30x vise linija koda naravno :D ) :DDD
 
Odgovor na temu

mish_ns
Miloš Krstin
Novi Sad

Član broj: 159930
Poruke: 1100
212.178.235.*

Sajt: milos-krstin.iz.rs


+18 Profil

icon Re: maskiranje i promena vrednosti na nivou bita27.04.2011. u 08:38 - pre 98 meseci
Ajd da probam da ti odg.

Code:
printf("\nunesite jedan pozitivan ceo broj u heksadecimalnom obliku");
printf("\nopseg broja: do 0xffff");
scanf("%x, &x");


Prvo unosis hex broj. recimo nek to bude 0x0017 (u bin obliku je to 0001 0111)

Code:
printf("\nUnesite redni broj bita koji se ispituje od 1 do 16");
scanf("%d, &n");


Zatim unosis redni broj bita koji ispitujes recimo prvi slucaj n=6 i drugi n=5

Code:
if(x & (1<<(n-1)))
printf("\n %d bit zadatog podatka ima vrednost 1",n);

else
printf("\n %d bit zadatog podatka ima vrednost 0",n);


Ovaj deo koda vrsi ispitivanje.

Broj 0x0017 kad se prebaci u binarni oblik je 0000 0000 0001 0111 (hex-converter)

& je bit operator AND (Operators_in_C)

E sad 1<<(n-1) za prvi slucaj (n=6) je (znaci broj 1 siftovan ulevo za 5 pozicija): 0010 0000
kada se uradi if(x&(1<<(n-1))) tj.
0001 0111
0010 0000
----------
0000 0000
Na poziciji 6 imas 0&1 sto ce dati 0. (samo 1&1 je 1 ostalo daje nulu). Tako da na poziciji 6 imas nulu.

x^=(1<<(n-1));
Zatim se radi bit operator xor (o^1 je 1 ostalo je nula)
0001 0111
0010 0000
----------
0011 0111 ovo je nova vrednost x

za n=5 je malo drugacije...to probaj sam :)


 
Odgovor na temu

Konstantin91
Konstantin Petrovic
Mladenovac

Član broj: 57918
Poruke: 168
*.bitinfo.rs.



+34 Profil

icon Re: maskiranje i promena vrednosti na nivou bita27.04.2011. u 17:24 - pre 98 meseci
Sada sam shvatio u potpunosti zadatak, ovo sve sto si naveo sam vec znao jedino ovo sa siftovanjem nisam znao ali je to sada reseno... Hvala ti na detaljnom objasnjenju...
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: maskiranje i promena vrednosti na nivou bita

[ Pregleda: 1416 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

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