เป็นการบีบอัดอย่างง่ายที่คุณใช้ตัวแปรตัวเลขหนึ่งตัวเพื่อเก็บสถานะบูลีน / ไบนารีจำนวนมากโดยใช้การเสแสร้งและความจริงที่ว่าทุกการเพิ่มทวีคูณเป็น 1 + ผลรวมของก่อนหน้านี้ทั้งหมด
ฉันแน่ใจว่ามันต้องเป็นเทคนิคที่เก่าแก่และเป็นที่รู้จักกันดี ผมได้ดำเนินการค้นหาหลายวิธีที่ฉันสามารถคิดที่จะอธิบายมันทุกครั้ง แต่พบว่าไม่มีอะไรเกินกว่าบางบทความบล็อกที่เขียนบทความดูเหมือนจะได้คิดว่าตัวเองนี้และไม่ทราบว่าจะเรียกมันว่าอย่างใดอย่างหนึ่ง ( เช่น 1 , ตัวอย่างที่ 2 )
ตัวอย่างเช่นนี่เป็นการใช้งานที่ง่ายมากซึ่งมีจุดประสงค์เพื่อแสดงแนวคิด:
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
}
คุณยังสามารถใช้ตัวดำเนินการระดับบิตการแยกหมายเลข 2 ฐาน enums ... มีหลายวิธีที่มีประสิทธิภาพมากขึ้นในการใช้งานฉันสนใจในชื่อของวิธีการทั่วไปมากขึ้น
bool
โดยทั่วไปจะถูกเก็บเป็นจำนวนเต็ม 32 บิตภายใน ดังนั้นการบรรจุหีบห่อสามารถสร้างความแตกต่างของตัวประกอบ 32 ซึ่งเป็นจำนวนมากจริงๆ ฉันหมายความว่าโปรแกรมเมอร์ของเราพร้อมเสมอที่จะละทิ้งทรัพยากรของเราครึ่งหนึ่ง แต่โดยทั่วไปฉันลังเลที่จะทิ้ง 97% ของพวกเขา ปัจจัยเสียดังกล่าวสามารถสร้างความแตกต่างระหว่างความสามารถในการเรียกใช้กรณีการใช้งานที่สำคัญและหน่วยความจำไม่เพียงพอ
enums
และพวกเขาสามารถมีFlags
คุณลักษณะ พวกเขาสามารถทำให้โค้ดของคุณง่ายยิ่งขึ้น