Czy mogę używać literału binarnego w C lub C ++?

191

Muszę pracować z liczbą binarną.

Próbowałem pisać:

const x = 00010000;

Ale to nie zadziałało.

Wiem, że mogę użyć liczby szesnastkowej o tej samej wartości 00010000, ale chcę wiedzieć, czy istnieje typ w C ++ dla liczb binarnych, a jeśli nie, czy istnieje inne rozwiązanie mojego problemu?

hamza
źródło
51
Wiesz, że 00010000to ósemkowe, prawda? (A w twojej deklaracji brakuje jakiegoś typu.)
Keith Thompson
Tutaj nowoczesny sposób przy użyciu literałów C ++.
Lol4t0
2
C ++ 14 dodał do tego funkcję. Zobacz moją nową odpowiedź, aby uzyskać więcej informacji na dole. Oczywiście wymaga kompilatora, który go implementuje.
lpapp
1
@FormlessCloud: są to reguły składniowe podane w standardach C i C ++ ( 0bpojawia się tylko w C ++ 14). Są zaprojektowane tak, aby były jednoznaczne.
Keith Thompson
2
Możliwy duplikat literałów binarnych?
MJ Rayburn,

Odpowiedzi:

70

Możesz użyćBOOST_BINARY podczas oczekiwania na C ++ 0x. :) BOOST_BINARYma zapewne przewagę nad implementacją szablonów, o ile może być używana również w programach C (jest w 100% sterowana przez preprocesor).

Aby to zrobić (np. Wydrukować liczbę w postaci binarnej), możesz użyć itoafunkcji nieprzenośnej lub zaimplementować własną .

Niestety nie można zrobić podstawę 2 formatowania strumieni STL (ponieważ setbasebędzie tylko zasady honorowe 8, 10 i 16), ale można używać zarówno std::stringwersję itoa, lub (w bardziej zwięzły, ale nieznacznie mniej wydajne) std::bitset.

#include <boost/utility/binary.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <bitset>
#include <iostream>
#include <iomanip>

using namespace std;

int main() {
  unsigned short b = BOOST_BINARY( 10010 );
  char buf[sizeof(b)*8+1];
  printf("hex: %04x, dec: %u, oct: %06o, bin: %16s\n", b, b, b, itoa(b, buf, 2));
  cout << setfill('0') <<
    "hex: " << hex << setw(4) << b << ", " <<
    "dec: " << dec << b << ", " <<
    "oct: " << oct << setw(6) << b << ", " <<
    "bin: " << bitset< 16 >(b) << endl;
  return 0;
}

produkuje:

hex: 0012, dec: 18, oct: 000022, bin:            10010
hex: 0012, dec: 18, oct: 000022, bin: 0000000000010010

Zapoznaj się także z The Suther Formatters of Manor Farm Herb Suttera, aby uzyskać interesującą dyskusję.

Vladr
źródło
2
Jak sama strona, do której prowadzi link, możesz używać tylko 8, 10 lub 16 z setbase. Jednak:int main() { cout << bitset<8>(42); }
@Roger dziękuję za bitsetpodpowiedź, ale już trochę poprawiłem, setbasezanim zobaczyłem twój komentarz.
vladr
Oto samouczek na temat literałów zdefiniowanych przez użytkownika w c ++ 11: akrzemi1.wordpress.com/2012/10/23/user-defined-literals-part-ii . Oczywiście c ++ 1y (aka c ++ 14) będzie zawierał literały binarne w standardzie.
cheshirekow