Sprawdzanie stanu poszczególnych bitów liczby 8-bitowej

0

WItam

Mam bardzo proste zadanie, ale męczę się z nim od dwóch dni. Myślę, że robię jakiś prosty błąd, ale czasem się człowiek tak zatnie, że drugi musi po "popchnąć", stąd ten post. Mianowicie chcę sprawdzić stan poszczególnych bitów (0 lub 1) liczby ośmiobitowej. Mój kod znajduje się poniżej. Próbowałem napisać  program "od zera", próbowałem na inne sposoby (w pętli, z flagami bitowymi itp.), ale nadal otrzymuje taki sam wynik.. Nie mam już pomysłów co jest nie tak.

Podając liczbę 11111111 otrzymuje wynik 1-1-0-0-0-0-0-0

Proszę o pomoc. Pozdrawiam

#include <stdio.h>

int main()
{
  int liczba; 
	
	printf("Wprowadź ośmiobitową liczbę: ");
	scanf("%d",&liczba);
	
	
	 if (liczba & 1 << 1)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
    
     if (liczba & 1 << 2)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
    
     if (liczba & 1 << 3)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
 
     if (liczba & 0 << 4)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
	  
	 if (liczba & 0 << 5)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
	   
	 if (liczba & 0 << 6)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
	   
	 if (liczba & 0 << 7)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
	
	 if (liczba & 0 << 8)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
	
}
3

1111111110 to 1010100110001010110001112

Wypisujesz 3 z 4 ostatnich cyfr binarnych (nie wypisujesz ostatniej, 1 << 1 to 2, pozostałe 5 sprawdzeń to zawsze zero, bo x & 0 = 0), czyli 110 00000 jest uzasadnione.

Użyj pętli, przesuwaj bitowo w lewo od 0 do 7 (a nie od 1 do 8), i przede wszystkim, testuj na sensownych wartościach. 25510 to 111111112

0

Dzięki za szybką odpowiedź. Całkiem zapomniałem o systemie liczb.. Wpisanie 255 "wypluwa" mi 1-1-1-0-0-0-0-0, więc chyba muszę powalczyć z przesuwaniem bitów.

0

Tak jak pisałem, 5 ostatnich wypisujesz zawsze 0

0

Teraz wszystko jasne. Tak jak wspomniałem - zaciąłem się na amen, ale dzięki za kopa w cztery litery :D Teraz program działa poprawnie, poniżej zamieszczam kod "dla potomstwa". Oczywiście muszę ubrać to w pętle.

#include <stdio.h>

int main()
{
  int liczba; 
	
	printf("Wprowadź ośmiobitową liczbę: ");
	scanf("%d",&liczba);
	
	
	  if (liczba & 1 << 0)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
    
      if (liczba & 1 << 1)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
    
      if (liczba & 1 << 2)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
 
      if (liczba & 1 << 3)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
	  
	  if (liczba & 1 << 4)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
	   
	  if (liczba & 1 << 5)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
	   
	  if (liczba & 1 << 6)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
	
	 if (liczba & 1 << 7)
    {
        printf ("1-");
    }
    else{
		printf ("0-");
	}
}
5

Tak wygląda poprawne wyświetlenie stanu bitów liczby (bez użycia pętli) – najstarszy bit najpierw:

#include <stdio.h>

int main()
{
  int number;

  printf("type 8-bit number: ");
  scanf("%d", &number);

  printf("%d-", number >> 7 & 1);
  printf("%d-", number >> 6 & 1);
  printf("%d-", number >> 5 & 1);
  printf("%d-", number >> 4 & 1);
  printf("%d-", number >> 3 & 1);
  printf("%d-", number >> 2 & 1);
  printf("%d-", number >> 1 & 1);
  printf("%d-", number >> 0 & 1);
}

a tak z pętlą:

#include <stdio.h>

int main()
{
  int number;

  printf("type 8-bit number: ");
  scanf("%d", &number);

  for(int shift = 7; shift >= 0; shift--)
    printf("%d-", number >> shift & 1);
}

Zobacz czym różni się Twój kod sprawdzający dany bit od powyższego (nie chodzi mi o pętlę, a o kolejność przesunięcia bitowego oraz koniunkcji).

1 użytkowników online, w tym zalogowanych: 0, gości: 1