int temp = 0x5E; // in binary 0b1011110.
Apakah ada cara untuk memeriksa apakah bit 3 dalam suhu 1 atau 0 tanpa sedikit pergeseran dan masking.
Hanya ingin tahu apakah ada fungsi bawaan untuk ini, atau saya terpaksa menulisnya sendiri.
c++
c
bit-manipulation
Milan
sumber
sumber
!= 0
benar, jadi mengapa repot-repot?1
sama benarnya dengan0.1415
!std::bitset
, benarkah? Tentu, daripada melakukan sedikit pekerjaan (dan berpotensi beberapa templat yang sangat bagus) untuk memeriksa sedikit pun, gunakan wadah kembung yang menyimpan (pada implementasi saya) setiap 'bit' dalam tempat yang tidak terpakaiunsigned long
. Sungguh menyia-nyiakan ruang!Periksa apakah bit N (mulai dari 0) disetel:
Tidak ada fungsi bawaan untuk ini.
sumber
1 << 0
?? Maaf bingung1<<0
1 tanpa shift (shift 0), yaitu1<<0 == 1
Saya hanya akan menggunakan std :: bitset jika itu C ++. Sederhana. Mudah. Tidak ada kesempatan untuk kesalahan bodoh.
atau bagaimana dengan kekonyolan ini
sumber
std::bitset<CHAR_BIT * sizeof(int)>
bahkan lebih tepatApa yang dilakukan jawaban yang dipilih sebenarnya salah. Fungsi di bawah ini akan mengembalikan posisi bit atau 0 tergantung pada apakah bit benar-benar diaktifkan. Ini bukan yang diminta poster itu.
Inilah yang awalnya dicari poster itu. Fungsi di bawah ini akan mengembalikan 1 atau 0 jika bit diaktifkan dan bukan posisinya.
sumber
bool has_feature = CHECK_BIT(register, 25);
Senang mengetahui bahwa saya bisa melakukannya tanpa negasi ganda.Ya, saya tahu saya tidak "harus" melakukannya dengan cara ini. Tapi saya biasanya menulis:
Misalnya:
Antara lain, pendekatan ini:
Misalnya: #define ABS (X) (((X) <0)? - (X): (X))
ABS (i ++);
sumber
Menurut deskripsi bidang bit ini , terdapat metode untuk menentukan dan mengakses bidang secara langsung. Contoh dalam entri ini adalah:
Juga, ada peringatan di sana:
sumber
Anda dapat menggunakan Bitset - http://www.cppreference.com/wiki/stl/bitset/start .
sumber
Gunakan std :: bitset
sumber
temp
perlu direfleksikan untuk membuatnya menjadi "big-endian"?Ada, yaitu instruksi intrinsik _bittest .
sumber
Saya menggunakan ini:
di mana "pos" didefinisikan sebagai 2 ^ n (ig 1,2,4,8,16,32 ...)
Mengembalikan: 1 jika benar 0 jika salah
sumber
4 = 2^(3-1)
untuk posisi bit 3 karena itu adalah bagian dari pertanyaan.saya mencoba membaca integer 32-bit yang menentukan bendera untuk objek dalam PDF dan ini tidak berfungsi untuk saya
yang memperbaikinya adalah mengubah definisi:
operan & mengembalikan integer dengan flag yang keduanya ada di 1, dan tidak mentransmisikan dengan benar ke dalam boolean, ini berhasil
sumber
!= 0
akan melakukan hal yang sama. Tidak tahu bagaimana instruksi mesin yang dihasilkan mungkin berbeda.Anda bisa "mensimulasikan" perpindahan dan pemaskeran: if ((0x5e / (2 * 2 * 2))% 2) ...
sumber
Untuk solusi khusus x86 tingkat rendah, gunakan TEST x86 opcode .
Kompiler Anda harus mengubah _bittest menjadi ini ...
sumber
Mengapa tidak menggunakan sesuatu yang sederhana seperti ini?
OUTPUT: biner:
11111111
sumber
std::cout << (((status & (1 << i)) ? '1' : '0');
. Anda harus menggunakanCHAR_BIT
konstanta dari<climits>
alih-alih pengkodean keras 8 bit, meskipun dalam hal ini Anda tahu hasilnya akan tetap 8 karena Anda menggunakanuint8_t
jika Anda hanya ingin cara kode keras yang nyata:
perhatikan hw ini tergantung dan anggap urutan bit ini 7654 3210 dan var adalah 8 bit.
Hasil dalam:
1 0 1 0
sumber
Meskipun cukup terlambat untuk menjawabnya sekarang, ada cara sederhana untuk mengetahui apakah bit ke-N disetel atau tidak, cukup dengan menggunakan operator matematika POWER dan MODULUS.
Katakanlah kita ingin tahu apakah 'temp' memiliki bit ke-N atau tidak. Ekspresi boolean berikut akan menjadi true jika bit disetel, 0 jika tidak.
Perhatikan contoh berikut:
Jika saya ingin tahu apakah bit ke-3 disetel atau tidak, saya mengerti
Jadi ekspresi mengembalikan nilai true, menunjukkan bit ke-3 disetel.
sumber
Salah satu pendekatan akan memeriksa dalam kondisi berikut:
Program penjelasan akan menjadi:
Keluaran:
sumber
pos - Posisi bit dimulai dari 0.
mengembalikan 0 atau 1.
sumber
Saya membuat ini:
LATGbits.LATG0 = ((m & 0x8)> 0); // untuk memeriksa apakah bit-2 dari m adalah 1
sumber
cara tercepat adalah tabel pencarian untuk topeng
sumber