Skocz do zawartości

[C] Przesuwanie bitów


Rekomendowane odpowiedzi

  • Administratorzy
Opublikowano

Dobra, mój arcygienialny facet od programowania, znany też jako "Pączek", wymyślił program którego sam nie rozumie, ja też nie mam pojęcia o co chodzi, ale mam jeszcze was :)

 

Więc po kolei. Dana jest funkcja:

unsigned getbits(unsigned x, int x, int p)
{
return (( x >> (p+1-n)) &~(~0<<n));
}

 

Zadanie: napisać funkcję

- czytającą liczbę (unsigned) binarną

- drukujący liczbę (unsigned) binarną

 

program ma wyglądać tak:

x = czytajBin();
y = getbits(x,5,9);
drukujBin(y);

 

Oczywiście jak wpiszę do programu "1101" to on widzi to jako int 13 i potem po przejsciu getbits, drukuje znów jako binarkę.

 

No więc dobra, napisałem program, ale mi się nie podoba, kto mi go poprawi?

 

#include <stdio.h>
#define LONG 100

int len;

unsigned getbits(unsigned x,int n,int p)
{
return (x >> (p + 1 - n)) & ~(~0 << n);
}

int czytajBin()
{
char tekst[LONG];
int i,wynik,potega,dlugosc;

printf("podaj:\n");
scanf("%[0-1]",&tekst);

wynik = 0;
dlugosc = 0;

for(i=0; i<LONG; i++)
{
	if ( tekst[i]=='1' || tekst[i]=='0' ) dlugosc ++;
}

len = dlugosc;

for(i=0; i<dlugosc; i++)
{
	if ( i==0 ) potega=1;
	if ( i==1 ) potega=2;
	if ( tekst[dlugosc-i-1]=='1' ) wynik+=potega;
	if ( tekst[dlugosc-i-1]!='1' && tekst[dlugosc-i-1]!='0' ) break;

	potega = potega * 2;
}

return wynik;
}

void drukujBin(unsigned a,int len)
{
int i;
char liczba[LONG];

for (i=0; i<LONG; i++)
{
	liczba[i]='0';
}

i=0;
if (a == 0) liczba[0]='0';
else while ( a > 0)
{
	liczba[i] = ( a % 2 == 0) ? '0' : '1';
	a = a/2;
	i++;
}

printf("Po przesunieciu:\n");

for (i=len-1; i>=0; i--)
{
	printf("%c",liczba[i]);
}
printf("\n\n");

}

main()
{
int x,y;
x = czytajBin();
y = getbits( x , 5 , 9 );
drukujBin( y , len );
}

  • Administratorzy
Opublikowano

Uwielbiam sam sobie odpowiadać:

#include<stdio.h>
#include<stdlib.h>

// funkcja getbits
// wycina n bitow z "x" od pozycji p w prawo
// (zerowa pozycja to skrajnie prawa pozycja) 

unsigned getbits(unsigned x, int n, int p)
{
  return ((x>>(p-n+1)) & ~(~0<< n));
}

//czyta binarne
unsigned czytajBin()
{
unsigned x=0;
int z;

while ( (z=getchar())!=EOF && z!='\n' )
{
	if (z=='0') x<<=1;
	else if (z=='1') 
	{
		x<<=1;
		x |=01;
	}
	else return 0;
}

return x;
}

//drukuje binarne
void drukujBin(unsigned x)
{
int j,y;

for( j=8*sizeof(unsigned)-1; j>=0; j--)
{
	y=x>>j;
	if ((y&1)==0) putchar ('0');
	else putchar ('1');
}
printf("\n");
}



int main()
{
unsigned x;

x = czytajBin();
x = getbits(x, 5, 9);
drukujBin(x);

return 0;
}

  • 2 tygodnie później...
Opublikowano

Ale jak Ty gnysek, zadałeś sobie pytanie i odpowiedziałeś to poco zakładasz temat?? Co do tematu, trochę tego kodu rozumiem, ale jakoś nie umiem zrozumieć całego kodu :unsure: .

 

Odświeżenie tematu + Post nie na temat.

gnysek

  • Administratorzy
Opublikowano

Bo jak zakładałem temat, nie znałem odpowiedzi, chyba logiczne?

Za odświeżanie i spam dostajesz oczywiście ostrzeżenie, bo ten post nie wnosi nic do tematu, poza tym nie przepadam jak mi ktoś zwraca uwagę, zwłaszcza gdy jego zachowanie jest dużo poniżej poziomu.

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...