Ini adalah semacam kompresi sederhana di mana Anda menggunakan satu variabel numerik untuk menyimpan banyak status boolean / biner, menggunakan penggandaan dan fakta bahwa setiap angka penggandaan adalah 1 + jumlah dari semua yang sebelumnya.
Saya yakin itu pasti teknik lama dan terkenal, saya ingin tahu apa namanya untuk merujuk dengan benar. Saya telah melakukan beberapa pencarian pada setiap cara yang saya bisa pikirkan untuk menggambarkannya, tetapi tidak menemukan apa pun di luar beberapa artikel blog di mana penulis artikel tampaknya telah menemukan jawabannya sendiri dan tidak tahu harus menyebutnya apa, misalnya ( contoh 1 , contoh 2 ).
Sebagai contoh, berikut ini adalah implementasi yang sangat sederhana yang dimaksudkan untuk menggambarkan konsep:
packStatesIntoNumber () {
let num = 0
if (this.stateA) num += 1
if (this.stateB) num += 2
if (this.stateC) num += 4
if (this.stateD) num += 8
if (this.stateE) num += 16
if (this.stateF) num += 32
return num
}
unpackStatesFromNumber (num) {
assert(num < 64)
this.stateF = num >= 32; if (this.stateF) num -= 32
this.stateE = num >= 16; if (this.stateE) num -= 16
this.stateD = num >= 8; if (this.stateD) num -= 8
this.stateC = num >= 4; if (this.stateC) num -= 4
this.stateB = num >= 2; if (this.stateB) num -= 2
this.stateA = num >= 1; if (this.stateA) num -= 1
}
Anda juga bisa menggunakan operator bitwise, parsing angka 2 dasar, enum ... Ada banyak cara yang lebih efisien untuk mengimplementasikannya, saya tertarik dengan nama pendekatan yang lebih umum.
sumber
enums
, dan mereka dapat memilikiFlags
atribut. Mereka bisa membuat kode Anda jauh lebih sederhana.bool
umumnya disimpan sebagai integer 32 bit secara internal. Dengan demikian, pengepakan dapat membuat perbedaan faktor 32. Itu sangat banyak. Maksudku, kita programmer selalu siap untuk membuang setengah dari sumber daya kita, tetapi saya umumnya enggan membuang 97% dari mereka. Faktor pemborosan seperti itu dapat dengan mudah membuat perbedaan antara kemampuan menjalankan kasing yang penting dan kehabisan memori.Jawaban:
Ini paling sering disebut sebagai bidang bit , dan istilah lain yang sering Anda dengar adalah topeng bit , yang digunakan untuk mendapatkan atau menetapkan nilai bit individual atau seluruh bidang bit sekaligus.
Banyak bahasa pemrograman memiliki struktur tambahan untuk membantu dengan ini. Seperti yang dicatat oleh @BernhardHiller dalam komentar, C # memiliki enum dengan flag ; Java memiliki kelas EnumSet .
sumber
BitArray
, yang memungkinkan menyimpan jumlah bit yang sewenang-wenang dan mengindeksnya (sementara bendera terbatas pada tipe integer dan dimaksudkan untuk digunakan sebagai topeng).Aneh, sedikit istilah yang berbeda di sini, tetapi saya tidak melihat istilah yang langsung terlintas dalam pikiran (dan itu ada dalam judul pertanyaan Anda!) - Pengepakan Bit adalah apa yang selalu saya dengar istilahnya.
Saya pikir ini benar-benar jelas tetapi anehnya ketika saya mencari di google, ini sepertinya adalah istilah yang banyak digunakan tetapi tidak didefinisikan secara resmi (Wikipedia tampaknya mengarahkan kembali ke bidang bit yang merupakan cara untuk melakukan pengepakan bit, tetapi bukan nama untuk proses). Mencari definisi tampaknya mengarah ke halaman ini:
http://www.kinematicsoup.com/news/2016/9/6/data-compression-bit-packing-101
Yang tidak bagus untuk tujuan SO tetapi itu adalah definisi / deskripsi terbaik yang dapat saya temukan termasuk deskripsi ringkas ini: "Pengepakan bit adalah konsep sederhana: Gunakan sesedikit mungkin untuk menyimpan sepotong data."
sumber
char
array dengan meletakkan duachar
s menjadi satuint
.Ada banyak istilah berbeda yang digunakan untuk menggambarkan ini.
Paling umum bit disebut "bit flags" atau "bit fields".
(Namun, perlu dicatat bahwa "bidang bit" terkadang merujuk ke fitur spesifik bahasa C dan C ++, yang terkait tetapi tidak persis sama.)
Bilangan bulat itu sendiri disebut sebagai "bit array", "bit set" atau "bit vector", tergantung pada penggunaan dan keadaan.
Either way, mengekstraksi bit dari set bit / vektor / array dilakukan melalui pemindahan dan masking.
(yaitu menggunakan topeng bit .)
Untuk beberapa contoh setiap istilah yang digunakan aktif:
std::bitset
BitSet
BitArray
bitvector
,bitarray
danbitset
bitarray
proyek danBitVector
proyekIni tidak benar-benar berkaitan dengan pertanyaan, tetapi saya ingin mengatakan: tolong jangan gunakan penambahan dan pengurangan untuk mengatur dan menghapus bit karena metode-metode tersebut rentan terhadap kesalahan.
(yaitu jika Anda melakukannya
num += 1
dua kali, hasilnya setara dengannum += 2
.)Lebih suka menggunakan operasi bitwise yang sesuai, jika bahasa yang Anda pilih menyediakannya:
sumber
this.stateF = (num & 32) ? true : false
, dll. Tidak perlu bermutasinum
saat Anda mengekstraksi nilai.+
dan-
. Saya sekarang sudah menggunakan yang lebih baik dan digunakan!= 0
sebagai pengganti terner, yang saya rasa lebih ringkas sementara masih dieksklusikan.