Saya perlu bekerja dengan nomor biner.
Saya mencoba menulis:
const x = 00010000;
Tapi itu tidak berhasil.
Saya tahu bahwa saya dapat menggunakan angka heksadesimal yang memiliki nilai yang sama 00010000
, tetapi saya ingin tahu apakah ada tipe dalam C ++ untuk angka-angka biner dan jika tidak, apakah ada solusi lain untuk masalah saya?
00010000
oktal, bukan? (Dan deklarasi Anda tidak memiliki tipe.)0b
hanya muncul di C ++ 14). Mereka dirancang untuk tidak ambigu.Jawaban:
Anda dapat menggunakan
BOOST_BINARY
sambil menunggu C ++ 0x. :)BOOST_BINARY
bisa dibilang memiliki keunggulan dibandingkan implementasi templat sejauh dapat digunakan dalam program C juga (100% preprocessor-driven.)Untuk melakukan sebaliknya (yaitu mencetak angka dalam bentuk biner), Anda dapat menggunakan non-portabel
itoa
fungsi , atau menerapkan sendiri .Sayangnya Anda tidak dapat melakukan pemformatan basis 2 dengan aliran STL (karena
setbase
hanya akan menghormati basis 8, 10 dan 16), tetapi Anda dapat menggunakanstd::string
versiitoa
, atau (yang lebih ringkas, namun sedikit kurang efisien)std::bitset
.menghasilkan:
Baca juga buku The String Formatters dari Manor Farm milik Herb Sutter untuk diskusi yang menarik.
sumber
int main() { cout << bitset<8>(42); }
bitset
tipnya, saya sudah sedikit mengoreksisetbase
sebelum saya melihat komentar Anda.Jika Anda menggunakan GCC maka Anda dapat menggunakan ekstensi GCC (yang termasuk dalam standar C ++ 14 ) untuk ini:
sumber
Anda dapat menggunakan literal biner. Mereka distandarisasi dalam C ++ 14. Sebagai contoh,
Dukungan dalam GCC
Dukungan dalam GCC dimulai pada GCC 4.3 (lihat https://gcc.gnu.org/gcc-4.3/changes.html ) sebagai ekstensi ke keluarga bahasa C (lihat https://gcc.gnu.org/onlinedocs/gcc/ C-Extensions.html # C-Extensions ), tetapi karena GCC 4.9 sekarang dikenal sebagai fitur C ++ 14 atau ekstensi (lihat Perbedaan antara literal biner GCC dan yang C ++ 14? )
Dukungan dalam Visual Studio
Dukungan di Visual Studio dimulai di Visual Studio 2015 Preview (lihat https://www.visualstudio.com/news/vs2015-preview-vs#C++ ).
sumber
Digit paling kiri dari literal masih harus 1, tetapi tetap saja.
sumber
binary<10>::value == binary<010>::value
dan beberapa pengecekan error)Beberapa kompiler (biasanya yang untuk mikrokontroler ) memiliki fitur khusus yang diimplementasikan dalam mengenali angka biner literal dengan awalan "0b ..." sebelum nomor tersebut, meskipun sebagian besar kompiler (standar C / C ++) tidak memiliki fitur seperti itu dan jika itu ini masalahnya, ini dia solusi alternatif saya:
Kerugian (bukan yang besar):
Keuntungan :
spending processor time
dalam operasi pointless (like "?.. :..", "<<", "+"
) ke program yang dapat dieksekusi (dapat dilakukan ratusan kali dalam aplikasi akhir);"mainly in C"
kompiler dan C ++ juga (template+enum solution works only in C++ compilers
);"enum solution" (usually 255 = reach enum definition limit)
, berbeda, batasan "literal konstan", dalam kompiler memungkinkan jumlah yang lebih besar;several header files
(dalam banyak kasus tidak mudah dibaca dan dimengerti, dan membuat proyek menjadi tidak perlu membingungkan dan diperluas, seperti menggunakan"BOOST_BINARY()"
);sumber
B_0100
tidak digunakan (bukan0100
)? Seperti pada misalnyachar b = BYTE(0100,0001);
._B2H
fungsi preprocessor.Utas ini dapat membantu.
Berhasil! (Semua kredit jatuh ke Tom Torfs.)
sumber
##
Operator preprocessor menempelkan token bersama. Jadi, dalam hal ini, jika Anda meneleponHEX__(10)
, itu akan diperluas ke0x10LU
.Seperti yang sudah dijawab, standar C tidak memiliki cara untuk secara langsung menulis angka biner. Namun, ada ekstensi kompiler, dan tampaknya C ++ 14 menyertakan
0b
awalan untuk biner. (Perhatikan bahwa jawaban ini awalnya diposting pada tahun 2010.)Salah satu solusi yang populer adalah memasukkan file header dengan makro pembantu . Salah satu opsi yang mudah adalah menghasilkan file yang menyertakan definisi makro untuk semua pola 8-bit, misalnya:
Ini menghasilkan hanya 256
#define
detik, dan jika lebih besar dari konstanta biner 8-bit diperlukan, definisi ini dapat dikombinasikan dengan shift dan OR, mungkin dengan macro pembantu (misalnya,BIN16(B00000001,B00001010)
). (Memiliki makro individu untuk setiap 16-bit, apalagi 32-bit, nilainya tidak masuk akal.)Tentu saja downside adalah bahwa sintaks ini mengharuskan penulisan semua nol terkemuka, tetapi ini juga dapat membuatnya lebih jelas untuk penggunaan seperti pengaturan bendera bit dan isi register perangkat keras. Untuk makro seperti fungsi yang menghasilkan sintaksis tanpa properti ini, lihat
bithacks.h
tertaut di atas.sumber
long long int
?Pola pikir over-engineering C ++ sudah diperhitungkan dengan baik dalam jawaban lain di sini. Inilah upaya saya melakukannya dengan pola pikir C, keep-it-simple-ffs:
sumber
C tidak memiliki notasi asli untuk angka biner murni. Taruhan terbaik Anda di sini adalah oktal (misal
07777
) dari heksadesimal (mis0xfff
).sumber
Anda dapat menggunakan fungsi yang ditemukan dalam pertanyaan ini untuk mendapatkan hingga 22 bit dalam C ++. Berikut kode dari tautan, yang diedit sesuai:
Jadi Anda bisa melakukan sesuatu seperti
binary<0101011011>::value
.sumber
Unit terkecil yang dapat Anda gunakan adalah byte (yang
char
bertipe). Anda dapat bekerja dengan bit meskipun dengan menggunakan operator bitwise.Sedangkan untuk bilangan bulat integer, Anda hanya dapat bekerja dengan angka desimal (basis 10), oktal (basis 8) atau heksadesimal (basis 16). Tidak ada literal biner (basis 2) dalam C atau C ++.
Angka oktal diawali dengan
0
dan angka heksadesimal diawali dengan0x
. Angka desimal tidak memiliki awalan.Dalam C ++ 0x Anda akan dapat melakukan apa yang Anda inginkan dengan cara melalui literal yang ditentukan pengguna .
sumber
<shameless_plug>
stackoverflow.com/questions/2611764#2611883</shameless_plug>
0b00101010
sebagai kenyamanan. SDCC adalah satu, dan saya yakin ada yang lain juga. (Sunting: Hah, pukuli aku untuk itu, @ Joey!)Anda juga dapat menggunakan rakitan inline seperti ini:
Oke, ini mungkin agak berlebihan, tetapi berhasil.
sumber
Berdasarkan beberapa jawaban lain, tetapi yang ini akan menolak program dengan literal biner ilegal. Nol terkemuka adalah opsional.
Contoh:
sumber
"Jenis" angka biner sama dengan angka desimal, hex atau oktal:
int
(atau bahkan char, pendek, panjang).Saat Anda menetapkan konstanta, Anda tidak bisa menetapkannya dengan 11011011 (dengan rasa ingin tahu dan sayangnya), tetapi Anda bisa menggunakan hex. Hex sedikit lebih mudah untuk diterjemahkan secara mental. Potong nibble (4 bit) dan terjemahkan ke karakter dalam [0-9a-f].
sumber
Anda bisa menggunakan bitset
sumber
Saya memberikan jawaban yang bagus yang diberikan oleh @ renato-chandelier dengan memastikan dukungan dari:
_NIBBLE_(…)
- 4 bit, 1 gigit sebagai argumen_BYTE_(…)
- 8 bit, 2 camilan sebagai argumen_SLAB_(…)
- 12 bit, 3 camilan sebagai argumen_WORD_(…)
- 16 bit, 4 camilan sebagai argumen_QUINTIBBLE_(…)
- 20 bit, 5 camilan sebagai argumen_DSLAB_(…)
- 24 bit, 6 camilan sebagai argumen_SEPTIBBLE_(…)
- 28 bit, 7 camilan sebagai argumen_DWORD_(…)
- 32 bit, 8 camilan sebagai argumenSaya sebenarnya tidak begitu yakin tentang istilah "quintibble" dan "septibble". Jika ada yang tahu alternatifnya, beri tahu saya.
Inilah makro yang ditulis ulang:
Dan inilah contoh penggunaan Renato:
sumber
Cukup gunakan perpustakaan standar di C ++:
Anda memerlukan variabel tipe
std::bitset
:Dalam contoh ini, saya menyimpan bentuk biner
10
dix
.8ul
mendefinisikan ukuran bit Anda, jadi7ul
artinya tujuh bit dan sebagainya.sumber
C ++ menyediakan templat standar bernama
std::bitset
. Cobalah jika Anda suka.sumber
Anda dapat mencoba menggunakan larik
bool
:sumber