Apa artinya "(int) nilai & 0x1, (int) nilai & 0x2, (int) nilai & 0x4, nilai (int) & 0x8" artinya? "


11

kode

"Nilai" berkisar dari 0 hingga 15 (nilai yang mungkin). Kapan 4 kondisi "jika" itu dipenuhi? Jika nilai (int) saya = 2 apakah ini berarti 0010?

            if  ((int)value & 0x1) 
            {
                //statement here
            }
            if  ((int)value & 0x2) 
            {
                //statement here
            }
            if  ((int)value & 0x4) 
            {
                //statement here
            }
            if  ((int)value & 0x8) 
            {
                //statement here
            }

3
Itu adalah bitmask yang memeriksa bit individual dari value(dibaca if(value & 0x4)sebagai "Apakah bit ke-3 valueset (= 1)). Ketika Anda tampaknya memiliki masalah dalam memahami kode, saya menganggap itu bukan milik Anda. Ini (dan fakta bahwa Anda tidak meminta untuk ulasan) membuat pertanyaan ini off-topik untuk CR.SE .
Tidak ada yang

Untuk pemahaman yang lebih baik, kode serupa yang telah porting ke C # akan menggunakan Enum.HasFlagmetode untuk menguji bit. Lihat: Enum.HasFlag .
rwong

Jawaban:


12

Setiap angka dapat dinyatakan value = b0*2^0 + b1*2^1 + b2*2^2 + b3*2^3 + ...dengan masing-masing b menjadi salah satu 0atau 1(ini adalah bit dari representasi). Ini adalah representasi biner.

Biner AND ( &) menganggap masing-masing bpasangan itu bijak dan melakukan AND pada mereka. Ini memiliki output sebagai berikut:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

Dengan menggunakan kekuatan 2 (yang hanya memiliki satu bit), kita dapat mengisolasi dan menguji masing-masing bit:

  • value & 1benar ketika valueganjil {1, 3, 5, 7, 9, 11, 13, 15}.

  • value & 2benar ketika value/2ganjil {2, 3, 6, 7, 10, 11, 14, 15}.

  • value & 4benar ketika value/4ganjil {4, 5, 6, 7, 12, 13, 14, 15}.

  • value & 8benar ketika value/8ganjil {8, 9, 10, 11, 12, 13, 14, 15}.

Prex 0x pada angka berarti harus ditafsirkan sebagai angka heksadesimal . Ini agak berlebihan ketika Anda hanya naik ke 0x8 tetapi memberitahu pengelola bahwa itu mungkin digunakan sebagai bitmask.


1
Kata-katanya mungkin menyarankan bahwa ia dapat diperluas ke semua angka, yang tidak benar: 8/6ganjil, sementara 8&6menghasilkan salah.
Sjoerd

@ Soerd itulah mengapa saya mengatakan "kekuatan 2"
ratchet freak

5

Pernyataan if ini memeriksa apakah bit tertentu valuediatur.

Nilai heksadesimal 0x4, misalnya, memiliki bit ke-3 dari set kanan ke 1dan semua bit lainnya diatur ke 0. Ketika Anda menggunakan biner-dan operator ( &) dengan dua operan, hasilnya akan memiliki semua bit diatur ke 0kecuali untuk bit-bit yang 1 di kedua operan.

Jadi, ketika Anda melakukan perhitungan value & 0x4, Anda baik mendapatkan biner 00000000atau binary 00000100, tergantung pada apakah atau tidak sedikit-3 valueadalah 1atau 0. Yang pertama mengevaluasi ke false, dan yang kedua ke true, sehingga jika-blok hanya dieksekusi untuk nilai-nilai di mana bit ke-3 diatur.


1

Ada dua hal menarik yang perlu diperhatikan di sini.

Pertama, ini adalah pola umum untuk memeriksa setiap 4 bit orde rendah dari nilai integral. Kondisi if terpenuhi jika bit yang sesuai diatur. Untuk nilai 2 pola bit memang 0010.

Pertanyaan lain yang lebih menarik adalah mengapa para (int)pemerannya? Terlepas dari gaya buruk menggunakan C-casts dalam C ++, tidak ada nilai integer atau karakter yang membutuhkan cast ini. Bool tidak masuk akal, double / float akan dikonversikan ke integer sementara dan tidak biasa menggunakan nilai literal untuk menguji enum. Mungkin masuk akal dengan pointer, tetapi itu akan menjadi penggunaan yang sangat khusus. Kesimpulan: para pemain tidak masuk akal.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.