Skocz do zawartości

[C] Przesuwanie bitów


gnysek

Rekomendowane odpowiedzi

  • Administratorzy

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 );
}

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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;
}

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...
  • Administratorzy

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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ę...