Typ char i wygenerowanie wszystkich możliwych kombinacji bitów

0

Witam,
Typ char w języku C++ jest 8-bitowy. Oznacza, że mogę wygenerować 256 wartości. Zależy mi, aby wygenerować wszystkie możliwe kombinacje bitów jakie mogę zapisać na tym typie np.

00000001
00000010
00000011
(...)
11111111

Wiem, że 1 bit w reprezentacji binarnej tego typu jest odpowiedzialny za znak.

for(char c = -125; c <= 125; ++c) {
  // c to pewna unikalna kombinacja bitów
}

Czy to zadziała dokładnie tak jak tego potrzebuje?

Pozdrawiam,

0

Typ char w C++ jest najczęściej 8-bitowy w C++. Nie wszędzie.

I nie, nie zadziała, bo nie dostaniesz kombinacji bitów odpowiadających liczbom -128 do -126 oraz 126 i 127.

0

Program ma działać na x86/x64 pod Windows i Linuksem. Otworzyłem podręcznik do języka C. Czytam w nim, że:
char od 0 do 127
signed char od -127 do 127
unsigned char od 0 do 255

Po co mi te kombinacje bitów? Wczytuje pewien plik do tablicy bajtów (QByteArray). Następnie chcę liczyć bity przyrównując ze stablicowanymi danymi. Czy każdy bit wczytany do QByteArray jest pewną liczbą od 0 do 127?
http://doc.qt.digia.com/qt/qbytearray.html
Wydaje mi się, że tak. Napisałbym więc:


for(char c = 0; c <= 127; ++c) {
  // c to pewna unikalna kombinacja bitów
}

0

Napisałem "czy każdy bit wczytany", chciałem napisać "Czy każdy bajt wczytany".

0

Zupełnie nie wiem o co Tobie chodzi...

ale ten kod:

HejHou napisał(a):

Napisałbym więc:


for(char c = 0; c <= 127; ++c) {
  // c to pewna unikalna kombinacja bitów
}

nie zadziała.
Warunek c<=127 jest prawdziwy dla liczby 127, więc co się stanie po zinkrementowaniu jej? Albo kompilator Ci to jakoś zoptymalizuje i poleci do wielkości int, albo dostaniesz nieskończoną pętlę.

0
char c = 0;
do {
    /* tutaj używamy 'c' */
} while (++c != 0);
HejHou napisał(a):

Wiem, że 1 bit w reprezentacji binarnej tego typu jest odpowiedzialny za znak.
Nie do końca. Tak na dobrą sprawę to wszystkie bity są "odpowiedzialne" za znak. Poczytaj o U2 ("kod uzupełnień do dwóch").

0

Czy nie można zrobić prościej:

for(unsigned i=0;i<256;++i)
  {
   unsigned char c=(unsigned char)i;
   /* tutaj używamy 'c' */
  }
1

Można to zrobić w ładnym C++:

  for (int i = std::numeric_limits<char>::min();
       i <= std::numeric_limits<char>::max();
       ++i) {
  
    char c = static_cast<char>(i);
  }

Zasadniczo zamiast przejmować się przepełnieniami w char lepiej właśnie wykorzystać szerszy typ i rzutowanie.

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