Saya mengikuti kursus perguruan tinggi tentang sistem operasi dan kami belajar bagaimana mengkonversi dari biner ke heksadesimal, desimal menjadi heksadesimal, dll. Dan hari ini kami baru belajar bagaimana angka yang ditandatangani / tidak ditandai disimpan dalam memori menggunakan komplemen dua (~ number +1
Kami memiliki beberapa latihan untuk dilakukan di atas kertas dan saya ingin dapat memverifikasi jawaban saya sebelum mengirimkan pekerjaan saya kepada guru. Saya menulis program C ++ untuk beberapa latihan pertama, tetapi sekarang saya buntu bagaimana saya bisa memverifikasi jawaban saya dengan masalah berikut:
char a, b;
short c;
a = -58;
c = -315;
b = a >> 3;
dan kita harus menunjukkan representasi biner dalam memori dari a
, b
dan c
.
Saya sudah melakukannya di atas kertas dan memberi saya hasil berikut (semua representasi biner dalam memori angka setelah komplemen keduanya):
a = 00111010 (ini char, jadi 1 byte)
b = 00001000 (ini char, jadi 1 byte)
c = 11111110 11000101 (pendek, jadi 2 byte)
Apakah ada cara untuk memverifikasi jawaban saya? Apakah ada cara standar dalam C ++ untuk menunjukkan representasi biner dalam memori angka, atau apakah saya harus mengkodekan setiap langkah sendiri (menghitung komplemen dua dan kemudian dikonversi ke biner)? Saya tahu yang terakhir tidak akan lama, tetapi saya ingin tahu apakah ada cara standar untuk melakukannya.
sumber
std::hex
) manipulator - Saya akan membiarkannya sebagai latihan bagi Anda untuk menyelesaikan sisanya ...Jawaban:
Cara termudah mungkin adalah membuat nilai
std::bitset
mewakili, lalu streaming itu kecout
.sumber
std::bitset
!+1
dari saya.bitset
Argumen konstruktor @Jesse: diartikan sebagai nilai yang tidak ditandatangani, yang berfungsi sama dengan komplemen dua. Sebenarnya, C ++ tidak menjamin aritmatika komplemen dua, dan juga-58 >> 3
operasi dalam contoh Anda tidak terdefinisi.Gunakan konversi on-the-fly ke
std::bitset
. Tidak ada variabel sementara, tidak ada loop, tidak ada fungsi, tidak ada makro.Live On Coliru
Cetakan:
sumber
x
digunakan:std::cout << std::bitset<8*sizeof(x)>(x)
.Jika Anda ingin menampilkan representasi bit dari objek apa pun, bukan hanya bilangan bulat, ingat untuk menginterpretasikan ulang sebagai array char terlebih dahulu, kemudian Anda dapat mencetak konten array itu, sebagai hex, atau bahkan sebagai biner (via bitset):
Perhatikan bahwa kebanyakan sistem umum adalah little-endian, sehingga output dari
show_binrep(c)
ini tidak dengan 1111111 011000101 Anda harapkan, karena itu bukan bagaimana itu disimpan dalam memori. Jika Anda mencari representasi nilai dalam biner, makacout << bitset<16>(c)
karya sederhana .sumber
Tidak ada
std::bin
, sepertistd::hex
ataustd::dec
, tetapi tidak sulit untuk menghasilkan biner angka sendiri:Anda menampilkan bit paling kiri dengan menutupi semua yang lain, menggeser ke kiri, dan mengulanginya untuk semua bit yang Anda miliki.
(Jumlah bit dalam suatu tipe adalah
sizeof(T) * CHAR_BIT
.)sumber
Mirip dengan apa yang sudah diposting, hanya menggunakan bit-shift dan mask untuk mendapatkan bit; dapat digunakan untuk semua jenis, menjadi templat (
hanya tidak yakin apakah ada cara standar untuk mendapatkan jumlah bit dalam 1 byte, saya menggunakan 8 di sini).sumber
CHAR_BIT
.Fungsi yang dapat digunakan kembali:
Pemakaian:
Ini bekerja dengan semua jenis bilangan bulat.
sumber
sumber
int t = pow(2, num_of_bits - 1);
?Menggunakan versi C ++ lama, Anda dapat menggunakan potongan ini:
sumber
Menggunakan std :: bitset jawaban dan templat kenyamanan:
Menggunakannya seperti ini:
Menghasilkan output:
sumber
Berikut adalah cara yang benar untuk mendapatkan representasi biner dari angka:
sumber
Apakah ini yang Anda cari?
sumber
</argument>
. Sungguh, kita orang dewasa, ya? Saya hampir memeriksa usia pada semua yang berkomentar di sini untuk memastikan semua orang lebih dari 13.