Saya ingin mengekstrak bit dari bilangan desimal.
Misalnya, 7 adalah biner 0111, dan saya ingin 0 1 1 1 semua bit disimpan dalam bool. Bagaimana saya bisa melakukannya?
Oke, loop bukanlah pilihan yang baik, dapatkah saya melakukan hal lain untuk ini?
c
bit-manipulation
Badr
sumber
sumber
(n >> k) & 1
sama validnya dan tidak perlu menghitung topeng karena topengnya konstan karena bergeser sebelum menutupi alih-alih sebaliknya.struct
juga dapat berguna, karena Anda mendapatkan semua data yang diperlukan dengan satu operasi.Seperti yang diminta, saya memutuskan untuk memperpanjang komentar saya pada jawaban telunjuk menjadi jawaban yang lengkap. Meskipun jawabannya benar, itu sangat rumit. Selanjutnya semua jawaban saat ini menggunakan tanda
int
s untuk mewakili nilai. Ini berbahaya, karena pergeseran kanan dari nilai-nilai negatif ditentukan oleh implementasi (yaitu tidak portabel) dan pergeseran ke kiri dapat menyebabkan perilaku yang tidak ditentukan (lihat pertanyaan ini ).Dengan menggeser bit yang diinginkan ke kanan ke posisi bit yang paling tidak signifikan, masking dapat dilakukan dengan
1
. Tidak perlu menghitung nilai topeng baru untuk setiap bit.Sebagai program lengkap, menghitung (dan kemudian mencetak) larik nilai bit tunggal:
Dengan asumsi bahwa Anda ingin menghitung semua bit seperti dalam kasus ini, dan bukan bit tertentu, loop dapat diubah lebih lanjut menjadi
Ini memodifikasi
input
di tempat dan dengan demikian memungkinkan penggunaan lebar konstan, pergeseran bit tunggal, yang mungkin lebih efisien pada beberapa arsitektur.sumber
Berikut salah satu cara untuk melakukannya — ada banyak cara lainnya:
Sulit untuk memahami mengapa penggunaan loop tidak diinginkan, tetapi cukup mudah untuk membuka loop:
Atau mengevaluasi ekspresi konstanta dalam empat pernyataan terakhir:
sumber
Berikut cara yang sangat sederhana untuk melakukannya;
sumber
@prateek terima kasih atas bantuannya. Saya menulis ulang fungsi dengan komentar untuk digunakan dalam sebuah program. Tingkatkan 8 untuk lebih banyak bit (hingga 32 untuk bilangan bulat).
sumber
Jika Anda tidak menginginkan loop apa pun, Anda harus menuliskannya:
Seperti yang ditunjukkan di sini, ini juga berfungsi di penginisialisasi.
sumber
sumber
Menggunakan
std::bitset
sumber