Apa keuntungan menggunakan operasi bitwise? [Tutup]


19

Setelah membaca buletin CodeProject terbaru, saya menemukan artikel ini tentang operasi bitwise . Itu membuat bacaan yang menarik, dan saya pasti bisa melihat manfaat dari memeriksa apakah bilangan bulat genap atau ganjil, tetapi menguji apakah bit ke-n diatur? Apa yang mungkin menjadi kelebihan dari ini?

Jawaban:


27

Operasi bitwise sangat penting ketika pemrograman perangkat keras mendaftar di sistem embedded. Misalnya setiap prosesor yang pernah saya gunakan memiliki satu atau lebih register (biasanya alamat memori tertentu) yang mengontrol apakah interupsi diaktifkan atau dinonaktifkan. Untuk memungkinkan interupsi ke api proses yang biasa adalah untuk mengatur bit aktif untuk satu jenis interupsi sementara, yang paling penting, tidak memodifikasi bit lain dalam register.

Ketika sebuah interupsi menyala, biasanya ia akan menetapkan status register sehingga suatu rutinitas layanan tunggal dapat menentukan alasan yang tepat untuk interupsi tersebut. Menguji masing-masing bit memungkinkan decode cepat dari sumber interupsi.

Dalam banyak embedded system, total RAM yang tersedia mungkin 64, 128 atau 256 BYTES (yaitu Bytes bukan kilobytes atau megabytes) Dalam lingkungan ini adalah umum untuk menggunakan satu byte untuk menyimpan beberapa item data, boolean flags dll dan kemudian menggunakan operasi bit untuk mengatur dan membaca ini.

Saya telah, selama beberapa tahun telah bekerja dengan sistem komunikasi satelit di mana payload pesan adalah 10,5 byte. Untuk memanfaatkan paket data ini dengan sebaik-baiknya, informasi harus dikemas ke dalam blok data tanpa meninggalkan bit yang tidak digunakan di antara bidang-bidang. Ini berarti menggunakan secara ekstensif operator bitwise dan shift untuk mengambil nilai informasi dan mengemasnya ke dalam muatan yang dikirim.


4
Bagi mereka yang tertarik dengan operasi dan optimisasi bit boolean lebih banyak, lihat Hacker's Delight: amazon.com/Hackers-Delight-Henry-S-Warren/dp/0201914654
gablin

7

Pada dasarnya, Anda menggunakannya karena pertimbangan ukuran dan kecepatan. Operasi bitwise sangat sederhana dan dengan demikian biasanya lebih cepat daripada operasi aritmatika. Misalnya untuk mendapatkan bagian hijau dari nilai rgb, pendekatan aritmatika adalah (rgb / 256) % 256. Dengan operasi bitwise Anda akan melakukan sesuatu (rgb >> 8) & 0xFF. Yang terakhir secara signifikan lebih cepat dan begitu Anda terbiasa, itu juga lebih mudah. Secara umum operasi bitwise banyak berperan ketika Anda harus menyandikan / mendekode data dalam cara yang ringkas dan cepat.


2
BYTE g1 = (rgb / 256) % 256; 00E51013...C1 E9 08...shr ecx,8 00E51016...88 0C 24...mov byte ptr [esp],cl
rwong

4

Jenis operasi ini sering digunakan ketika menulis untuk sistem tertanam di mana memori atau daya CPU dibatasi.

Misalnya, untuk menghemat ruang, Anda dapat menyimpan beberapa variabel dalam variabel int 8-bit tunggal dengan menggunakan setiap bit untuk mewakili boolean. Maka Anda perlu cara cepat untuk mengatur bit tertentu atau mengambil nilai bit.

Umumnya ketika pemrograman dalam bahasa tingkat yang lebih tinggi seperti C # pada PC desktop dengan memori Gigabytes, Anda tidak terlalu peduli bahwa masing-masing bool membutuhkan satu byte penuh . Tetapi jika Anda memprogram mikrokontroler dalam C dengan memori 2kb, setiap bit dihitung, sehingga kemampuan untuk mengemas 8 bool menjadi satu byte mungkin sangat penting.


.NET memiliki [Flags]atribut yang memungkinkan menggunakan bidang Enumsebagai bit. Misalnya, Fontmemiliki Styleproperti yang merupakan bidang bit yang berisi huruf tebal, miring, garis bawah, dan dicoret.
deltreme

@treme. Ya saya tahu Anda bisa menggunakan [Bendera], tapi bukan itu intinya. Intinya adalah bahwa dalam bahasa tingkat tinggi Anda tidak terlalu peduli tentang penggunaan beberapa byte ruang untuk beberapa bools. Anda biasanya lebih peduli tentang kemampuan pemeliharaan dan keterbacaan kode. Dalam sistem tertanam di mana Anda peduli tentang ukuran, Anda tidak memiliki akses ke hal-hal seperti atribut .net [Bendera], sehingga Anda dapat menggunakan operasi bitwise ini.
Simon P Stevens

"Tapi menguji apakah bit ke-n diatur? Apa yang mungkin menjadi keuntungan dari ini?" jadi itu intinya - tetapi karena tidak ada bahasa yang ditentukan saya memutuskan untuk memasukkannya sebagai komentar pada jawaban di mana C # disebutkan. Itu bukan komentar atas jawaban Anda, itu tambahan, atau baik untuk diketahui, atau apa pun.
deltreme

@ deltreme: Oh, keren.
Simon P Stevens

3

Operasi bitwise juga sering digunakan dalam codec video dan audio, untuk alasan yang sama seperti pada elektronik tertanam; bisa mengemas lima flag dan sebelas timer timer menjadi setengah int sangat berguna ketika Anda ingin membuat codec video super efisien.

Bahkan, MPEG 4 bahkan menggunakan pengkodean Golomb eksponensial untuk bidang panjang bit variabel. Nilai yang terakhir 17 atau 19 bit paket terakhir mungkin hanya tiga atau lima bit lebar paket ini - dan Anda akan mencari tahu dengan operasi bitwise.


2

Trik yang menggabungkan operasi logis bitwise, operasi shift bitwise, dan operasi aritmatika dapat dipahami oleh orang-orang yang telah mempelajari konstruksi penambah biner menggunakan gerbang logika (dan, atau, tidak). Di luar lingkaran itu, sangat sulit untuk dipahami tanpa komentar yang terperinci.

Ini berguna ketika memprogram unit SIMD , terutama jika arsitektur CPU sengaja meninggalkan beberapa instruksi SIMD karena mereka dapat ditiru oleh beberapa orang lain.

Sebagai contoh, arsitektur mungkin tidak mendefinisikan instruksi untuk mengambil nilai-nilai negatif dari sekelompok 16 byte, tetapi itu dapat ditiru dengan meniadakan bitwise dan kemudian menambahkan 1. Demikian juga, pengurangan dapat dihilangkan juga, karena dapat ditiru dengan mengambil negatif dari operan kedua. Ketersediaan "rute alternatif" adalah alasan untuk menghilangkan instruksi tertentu.

Demikian juga, SIMD hanya dapat mendukung penambahan paralel 8-bit, tanpa menerapkan penambahan untuk elemen yang lebih luas seperti 16-bit, 32-bit atau 64-bit. Untuk menirunya, kita perlu mengekstrak bit tanda dari hasil perhitungan 8-bit, kemudian melakukan operasi carry pada elemen berikutnya.


0

Data pengepakan, operasi yang lebih cepat (perkalian, pembagian, dan modulus secara signifikan lebih cepat jika disejajarkan dengan kekuatan 2), membalik sedikit, dll. Pelajari dan mulailah menggunakannya, dan Anda akan perlahan mulai melihat sebagian besar keuntungan Anda sendiri.


1
Itu jawaban yang agak ortogonal.
itsbruce
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.