Могу показать, как упаковать boolean'ы в number.
Вся магия заключается в том, что реально нужен для boolean'а всего 1 (один) бит, но занимает он 8 (?) бит.
Можно использовать Number как массив 8 (и более, зависит от размерности типа в битах) Boolean'ов.
Пусть для начала n = 0. Это означает, что все boolean'ы по-умолчанию установлены в false. Двоичная форма 0 = 0b00000000.
Чтение
Чтобы прочитать i-ый (договоримся отсчитывать элементы с конца, нумерация начинается с нуля) символ, используем побитовое И.
n & (1 << i)
вернет нам 0, если значение в этой ячейке ложно или степень двойки (2^i), если значение истинно.
Запись
Чтобы записать, например в первую (нумеровать будем с конца) ячейку 1, нужно использовать побитовое ИЛИ, т.е. n = n | 1. Чтобы записать 1 во вторую ячейку, нужно использовать n = n | 2, т.о. для записи 1 в i-ю ячейку используем n = n | (1 << i)
n = 0;
n |= 1 << prompt('Введите число: ');
alert( n.toString(2) )
Чтобы записать туда 0, нужно использовать побитовое И, однако если мы используем тот же прием, что и в предыдущем случае, нас постигнет облом. Но мы сыграем на другом. Если одним из операндов побитового И есть 2^n - 1, т.е. число, в двоичной форме записываемое как набор единиц и только единиц, то результат будет неизменен. Но если хотя бы один "компонент" будет равен нулю, то соответствующее число в результирующем наборе тоже обнулится. Теперь встает вопрос: как получить такой набор? Вспоминаем, что у нас есть такой замечательный унарный оператор как
~! Т.е. нам нужно просто взять 0, записать в нужную позицию 1 и применить побитовое отрицание.
var n = parseInt('11011',2), i = prompt('Что будем обнулять?');
n = n & ~(0 | (1 << i));
alert(n.toString(2));
А теперь соберем все это вместе и напишем класс BoolSet.
<script type="text/javascript">
function BoolSet(defaultState){
defaultState = defaultState || 0; // при желании тут можно обрабатывать строку или массив
this.n = defaultState;
}
BoolSet.prototype = {
get : function(i){
return !!(this.n & (1 << i));
},
set : function(i, value){
if(value = !!value) // 1
this.n |= 1 << i;
else // 0
this.n &= ~(0 | (1 << i));
}
};
</script>
<label>
<input type="checkbox" id="val" />
Записать в <input type="number" value="" id="idx-set" />-ый элемент true
</label> <input type="button" value="Go!" id="btn-set" /><br/>
Получить <input type="number" value="" id="idx-get" />-ый элемент <input type="button" value="Go!" id="btn-get" /><br/>
Значение сейчас: <span id="dec-val">0</span> (0b<span id="bin-val">0</span>)
<script type="text/javascript">
(function(){
var $ = function(id){return document.getElementById(id)},
boolSet = new BoolSet(0);
$('btn-set').onclick = function(){
var i = $('idx-set').value,
val = $('val').checked;
boolSet.set(i, val);
$('dec-val').innerHTML = boolSet.n;
$('bin-val').innerHTML = boolSet.n.toString(2);
}
$('btn-get').onclick = function(){
var i = +$('idx-get').value;
alert(boolSet.get(i));
};
}())
</script>
P.S. Это писалось по памяти по статье, прочитанной мною более года назад, поэтому где-то (особенно там, где мы записываем 0) я мог ошибиться.