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

Treba mi pomoc oko jednog zadatka - izmena vrednosti bitova

[es] :: C/C++ programiranje :: Treba mi pomoc oko jednog zadatka - izmena vrednosti bitova

[ Pregleda: 2843 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

martin_riggs
nezaposlen
Beograd

Član broj: 303016
Poruke: 7
*.dynamic.isp.telekom.rs.



+1 Profil

icon Treba mi pomoc oko jednog zadatka - izmena vrednosti bitova15.05.2012. u 09:06 - pre 128 meseci
Pozdrav narode.Kopiracu resen zadatak u C++ 2010 koji sam odradio, sve mi je jasno sta radi ali mi nije jasna logika.
for(i=0;i<n;i++) // 0 , 1 , 2 , 3 ...
{
maska = maska | (1<<i) ; // Maska za izmenu prvih "n" bitova...
printf("\n maska %d ", maska);
}
Jasno mi je kako se formira maska, za i = 0 maska ce biti 1, za i = 1 maska je 3 , i = 2 maska je 7 , shvatam da se maska uvecava po sledecem modelu maska = 2 * prethodna maska + 1 ali ne mogu da uhvatim logiku zasto i kako.

Zatim sledeci korak mi je jos manje jasan...kad program radi ovo :
for(i=0;i<n;i++) // 0 , 1 , 2 , 3 ...
{
maska = maska | (1<<i) ; // Maska za izmenu prvih "n" bitova...
}

y = (x ^ maska) & maska ; // Prvo izmena prvih n bitova pa onda 0 i za ostale...

E sad ako moze jedno strucno ali detaljno i podrobno objasnjenje koga ne mrzi da kuca a ja se unapred zahvaljujem!

PS : Ovo mi treba za ispit, jos mi jedino ovo nije jasno od provezbanih zadataka zato narode ako neko zna i ne mrzi ga da kuca ziv bio nek mi malo pojasni!

Ceo zadatak :
----------------------------------------------------------------------------------------------------------

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
int x,y,l,i,n, maska = 0;
printf("Jedan ceo broj : "); // neka bude broj 12
scanf_s("%d", &x);

l = 8*sizeof(int);

do
{
printf("Drugi ceo broj (redni broj bita u prvom broju) : " );
scanf_s("%d", &n) ; // neka bude prvih 6 bitova...dobija se 51.
}
while(n<1 || n>l) ;

for(i=0;i<n;i++) // 0 , 1 , 2 , 3 ...
{
maska = maska | (1<<i) ; // Maska za izmenu prvih "n" bitova...
}

y = (x ^ maska) & maska ; // Prvo izmena prvih n bitova pa onda 0 i za ostale...

printf("\n Brojevi x i y : %d %d " , x,y) ;
printf("\n Brojevi x i y u heksa obliku : %x %x " , x,y) ;

scanf_s("%d", &x);
return 0;
}
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3233

Jabber: djoka_l


+1393 Profil

icon Re: Treba mi pomoc oko jednog zadatka - izmena vrednosti bitova15.05.2012. u 09:29 - pre 128 meseci
Evo ti link pa pročitaj: http://www.learncpp.com/cpp-tutorial/38-bitwise-operators/

Nije mi jasno kako si "uradio" i "provežbao" zadatak, ako ne razumeš kako radi BITWISE OR, AND, XOR i LEFTSHIFT
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1239



+94 Profil

icon Re: Treba mi pomoc oko jednog zadatka - izmena vrednosti bitova15.05.2012. u 10:06 - pre 128 meseci
Idemo od manjih delova slagalice ka većim.

Operacija šiftovanja bitova u levo x << y daje rezultat x * 2^y (ako nema prelivanja bitova) evo malog primera u formi tabele za x = 19 = 00010011b i nekoliko vrednosti y:

y x<<y(bin) x<<y(dec)

0 00010011 19
1 00100110 38
2 01001100 76
3 10011000 152
4 00110000 48


Ako je x=1 onda se prosto ta jedna jedica u rezultatu pomera na levo za y mesta.

Operacija logičkog sabiranja bitova (bitvektorsko ILI) x | y daje rezultat koji ima bit 1 na svakom mestu gde x ILI y imaju bit jedan. Mrzi me sad da pravim tabelu, mislim da je ovo jasno, ali ako nije slobodno reci.

Kad se ukombinuju ove dve operacije, i to u petlji to onda izgleda kao na sledećem primeru. Recimo da je n=5. Na početku je maska=0 i imamo iteracije po promenljivoj i. Vrednost promenljive maska se prenosi u svakoj sledoćoj iteraciji, i praktično "akumulira":

i=0, maska = 0 | (1<<0) == 00000000 | 00000001 == 00000001 == 1
i=1, maska = 1 | (1<<1) == 00000001 | 00000010 == 00000011 == 3
i=2, maska = 3 | (1<<2) == 00000011 | 00000100 == 00000111 == 7
i=3, maska = 7 | (1<<3) == 00000111 | 00001000 == 00001111 == 15
i=4, maska = 15 | (1<<4) == 00001111 | 00010000 == 00011111 == 31


Sad kad imamo promenljivu maska treba da uradimo druge dve bitovske operacije, logičko eksluzivno ILI sa bitovima (bitvektorsko XOR), i logičko I sa bitovima (bitvektorsko AND). Prvo ide XOR, x ^ y, koji kao rezultat daje 1 na svakom mestu gde ILI x ima 1 ILI y ima jedan (zato ga zovi i logičko ILI-ILI). Ne znam kako sad ovo da objasnim, ali otprilike gde god da je jedinica u jednoj promenljivoj rezultat će dobiti ono što je suprotno od druge promenljive. Tamo gde su nule nema promene, a tamo gde su jedinice menja se bit (sa 0 na 1, i sa 1 na 0).

Posle ide AND, x & y. Tamo gde su nule u operandu posteće nule u rezultatu, a tamo gde su jedinice ostaje kako je bilo.

Kad imamo prvo XOR, pa onda AND sa istom promenljivom onda tamo gde su nule u promenljivoj maska postaće nule u y, a tamo gde su jedinice u maski y će dobiti vrednost invertovanog x, što ćemo predstaviti underscorom, x. Dakle ako je maska 00011111 i x prestavljeno sa svojim bitovima xxxxxxxx onda će y dobiti vrednost 000xxxxx.

Malo sam se smorio na kraju, ali probaj da shvatiš, pa ako nešto nije jasno opet pitaj.
 
Odgovor na temu

martin_riggs
nezaposlen
Beograd

Član broj: 303016
Poruke: 7
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Treba mi pomoc oko jednog zadatka - izmena vrednosti bitova16.05.2012. u 14:34 - pre 128 meseci
Hvala Mihajlo...jasnije mi je sad mada mi je ova tematika prilicno konfuzna generalno.Ali sad mi je jasan ovaj zadatak.
 
Odgovor na temu

martin_riggs
nezaposlen
Beograd

Član broj: 303016
Poruke: 7
*.dynamic.isp.telekom.rs.



+1 Profil

icon Deklaracija promenljivih u C...17.05.2012. u 14:37 - pre 128 meseci
Mihajlo, opet ja...
Mozes li ovo da mi pojasnis...

#define MAX 2

char s[6*(MAX+1)] // deklaracija promenljive... njene duzine pretpostavljam

printf("\n duzina promenljive : %d \n", strlen(s)); // ovo mi nije jasno...

a) kad dam da je MAX = 2 dobijem da je duzina promenljive s = 31
b) MAX = 3 , duzina s = 35
c) MAX = 4 , duzina s = 43
d) MAX = 5 , duzina s = 47

po kojoj zakonitosti se formira duzina ovog stringa u ovim slucajevima?

 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3233

Jabber: djoka_l


+1393 Profil

icon Re: Treba mi pomoc oko jednog zadatka - izmena vrednosti bitova17.05.2012. u 14:52 - pre 128 meseci
strlen nema smisla da koristiš na neinicijalizovanom stringu. Kada alociraš memoriju za char[] njen sadržaj nije definisan. strlen vraća broj karaktera do prvog \0 karakatera, a on može da bude i van opsega stringa.

Primer:

char test[100] = "test";
printf("%d\n", strlen(test));

daje rezultat 4 (a ne 100);

char test[100];
printf("%d\n", strlen(test));

daje nedifinisan rezultat - možda 0, možda bilo koji broj koji može biti i veći i manji od 100.
 
Odgovor na temu

martin_riggs
nezaposlen
Beograd

Član broj: 303016
Poruke: 7
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Treba mi pomoc oko jednog zadatka - izmena vrednosti bitova17.05.2012. u 14:56 - pre 128 meseci
#define MAX 2

char s[6*(MAX+1)]

A ovako definisan string koliko maksimalno karaktera moze da primi?To me muci...
Naprimer u ovom slucaju...


#define MAX 2

char s[6*(MAX)]

I u ovom bez + 1
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3233

Jabber: djoka_l


+1393 Profil

icon Re: Treba mi pomoc oko jednog zadatka - izmena vrednosti bitova17.05.2012. u 15:23 - pre 128 meseci
Maksimalna dužina stringa koja bi smela da se upiše u, na primer char[100] je 99 znakova, zato što poslednji znak (terminator stringa) mora da ima mesta da se upiše na kraju. C ne proverava opsege indeksa, tako da je regularno da u programu staviš

char s[100];

s[-1] = 'A';
s[1234] = 'B';

što može da proizvede raznorazne greške, koje se teško detektuju, ili da proizvede Segmentation Fault, ako ubodeš lokaciju u memoriji koja ne pripada adresnom prostoru koji je dodljen programu u vreme njegovog izvršavanja.
 
Odgovor na temu

martin_riggs
nezaposlen
Beograd

Član broj: 303016
Poruke: 7
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Treba mi pomoc oko jednog zadatka - izmena vrednosti bitova21.05.2012. u 14:58 - pre 128 meseci
Znam da sam dosadan ali moze li mi neko pojasniti sta znaci ova poruka?
Izasla mi je greska break ili continue, kad sam dao BREAK izaslo je ovo u zasebnom prozoru...

No symbols are loaded for any call stack frame.The source code cannot be displayed.
Call stack location 61727620()


Otkuca se neki tekst, pa posle program pita da li zelis da dodas neki tekst na taj uneti ili da uneses novi.Prvi put normalno unesem tekst i nadodam jos poneki put neki drugi tekst na postojeci , otkucam cak i novi i onda u tamo nekom 2-3 ponavljanju iskace ova greska...Kod je otkucan u C++ 2010 ako to nesto znaci...

Ovo je kod od programa :

========================================================================
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#define MAX 6


int _tmain(int argc, _TCHAR* argv[])
{

char s[6*(MAX+1)], t[MAX+1], *ptr;
int i , opcija ;

printf("\nZadati red znakova : \n") ;
gets(s);

// s je ovde prazan
for (i=0;i<5;i++)
{
printf("\n 1. Novi") ;
printf("\n 2. Dodatak") ;
printf("\n 3. Izlaz") ;
printf("\n\n Izabrati jednu od opcija : ") ;
scanf_s("%d", &opcija) ;
getchar() ;
if (opcija == 1 || opcija == 2)
{
printf("\n Zadati jos jedan red znakova : \n") ;
gets(t);
if (strcmp(s,t)!=0 ) // poredi dva stringa , vraca 0 ako su isti.
{
if(opcija == 1)
{
strcpy(s,t); // kopira string t u s (destination, source)
}
else
{
strcat(s,t) ; // dodaje string t na string s (spajanje stringova)
}
printf("\n Rezultujuci string : \n") ;
for(ptr = s ; *ptr != '\0'; ptr++)
{
putchar(*ptr);
}
putchar('\n') ;
}
}
else
{
break ;
}
}

return 0;
}

===================================================================================
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3233

Jabber: djoka_l


+1393 Profil

icon Re: Treba mi pomoc oko jednog zadatka - izmena vrednosti bitova21.05.2012. u 15:18 - pre 128 meseci
Nemam ideju odakle to učiš C++

Uzmi naki priručnik, pa ćeš da vidiš da je gets OPASNA funkacija, čija je slabost već bila upotrebljena za širenje virusa. Kod gets funkcije, moguće je upisati duži string nego što je veličina bafera, što može dovesti do prepisivanja podataka preko steka i izvršavanja malicioznog koda.

Umest gets se koristi fgets.

I, na kraju, odakle ti ideja da pišeš rezultujući string karakter po karakter pomoću putchar, umesto da lepo iskoristiš printf. Pa i ako si hteo da koristiš putchar, šta će ti još jedan pointer, kada si to sve mogao da uradiš i sa s.
 
Odgovor na temu

martin_riggs
nezaposlen
Beograd

Član broj: 303016
Poruke: 7
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Treba mi pomoc oko jednog zadatka - izmena vrednosti bitova23.05.2012. u 15:08 - pre 128 meseci
Shvatam.Hvala na odgovoru.
Imam jos jedan zadatak gde koristim fgets funkciju i imam jedan mali problem.
U for petlji ovaj red je sporan : fgets(rec, 50, stdin);
kad prodje prvi put kroz petlju samo prolece i ne dozvoljava mi da unesem prvu rec posle naredbe printf, ide dalje
sa praznom promenljivom "rec" a onda tek u sledecim prolazima normalno funkcionise, prikazuje printf i prihvata unos.
Ali samo u onom prvom prolazu ignorise , ne dozvoljava korisniku da ukuca tu prvu rec nego shiba dalje sa praznim stringom u promenljivoj "rec".Pomagajte!


Zadatak :

// Resenje3.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#define BROJ 10
#define LMAX 30
#define MAX 80

int broj_reci(int n, int m);

int _tmain(int argc, _TCHAR* argv[])
{
int n , m; // n - broj reci , m - duzina niza koji se sastoji od svake ukucane reci (maksimalno 30)
do
{
printf("\n Zadati broj n (broj reci) : \n");
scanf_s("%d",&n) ;
printf("\n Zadati broj m (maksimalna duzina reci) : \n");
scanf_s("%d",&m) ;
}
while (n<1 || n>BROJ || m < 1 || m > LMAX) ;

printf("\n Broj reci : %d" , broj_reci(n,m) ) ;

scanf_s("%d",&m) ;
return 0;
}
int broj_reci (int n , int m )
{
int i,j = 0 ;
char rec[50]="bilo sta" ;
char x[200] [200] ; // prvo ide broj elemenata , pa u drugoj zagradi duzina stringa


printf("\n Zadaj %d reci : " , n);
for (i=0;i<n;i++)
{
printf("\n Zadaj %d rec : " , i+1);
fgets(rec, 50, stdin);

if (strlen(rec) < m + 1 )
{
strcpy(x[j],rec);
j=j+1 ;
}
}

printf("\n Sada se stampa niz od unetih reci : \n" );
for (i=0;i<j;i++)
{
puts(x);
}
return j ;
}
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
80.93.235.*



+9 Profil

icon Re: Treba mi pomoc oko jednog zadatka - izmena vrednosti bitova24.05.2012. u 10:15 - pre 128 meseci
1. Treba da isprazniš buffer pre korišćenja fgets, jer ti se dešava da pokupiš neki "\n" (novi red viška).
2. Dole gde štampaš reči si zaboravio indeks.

Code:

/* ... */
for (i=0;i<n;i++)
{
  printf("\n Zadaj %d rec : " , i+1);
  fflush(stdin);
  fgets(rec, 50, stdin);

  if (strlen(rec) < m + 1 )
  {
    strcpy(x[j],rec);
    j=j+1 ;
  }
}
/* ... */
printf("\n Sada se stampa niz od unetih reci : \n" );
for (i=0;i<j;i++)
{
  puts(x[i]);
}
/* ... */


Čisto da znaš, ovo je čist C kod i ne bi trebalo da pišeš ovako u C++-u...

Pozdrav!
 
Odgovor na temu

martin_riggs
nezaposlen
Beograd

Član broj: 303016
Poruke: 7
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Treba mi pomoc oko jednog zadatka - izmena vrednosti bitova24.05.2012. u 10:21 - pre 128 meseci
Hvala puno.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Treba mi pomoc oko jednog zadatka - izmena vrednosti bitova

[ Pregleda: 2843 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

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