process.stdin.resume();
process.stdin.setEncoding('utf8');
// your code goes here
function BitArray() {
this.iarray = [];
}
BitArray.prototype.bit = function (index, bit) {
var shift_count = index & 31,
array_index = index >> 5;
if (arguments.length == 1) {
return (this.iarray[array_index] >> shift_count) & 1;
}
var bitmask = 1 << shift_count;
if (bit)
this.iarray[array_index] |= bitmask;
else
this.iarray[array_index] &= ~bitmask;
}
BitArray.prototype.numofbits = function () {
var len = this.iarray.length,
num = 0;
for (var i = 0; i < len; ++i) {
num += 1;
}
return num;
}
BitArray.prototype.numofbits = function () {
var len = this.iarray.length,
num = 0;
for (var i = 0; i < len; ++i) {
if (this.iarray[i])
num += this.ut.numofbits(this.iarray[i]);
}
return num;
}
BitArray.prototype.ut = {};
BitArray.prototype.ut.numofbits = function (bits) {
bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);
bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff);
return (bits & 0x0000ffff) + (bits >>16 & 0x0000ffff);
}
//----
process.stdout.write("Hello, World!\n");
var obj = new BitArray();
obj.bit( 0, 1);
obj.bit(100, 0);
obj.bit(200, 1);
obj.bit(300, 0);
obj.bit(400, 1);
// obj(4, 1); /* このように、objを関数として使えるとイイよね */
var num = obj.numofbits();
process.stdout.write("num = " + num.toString());
cHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTsKcHJvY2Vzcy5zdGRpbi5zZXRFbmNvZGluZygndXRmOCcpOwoKLy8geW91ciBjb2RlIGdvZXMgaGVyZQoKZnVuY3Rpb24gQml0QXJyYXkoKSB7Cgl0aGlzLmlhcnJheSA9IFtdOwp9CgpCaXRBcnJheS5wcm90b3R5cGUuYml0ID0gZnVuY3Rpb24gKGluZGV4LCBiaXQpIHsKCXZhciBzaGlmdF9jb3VudCA9IGluZGV4ICYgMzEsCgkJYXJyYXlfaW5kZXggPSBpbmRleCA+PiA1OwoKCWlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKCQlyZXR1cm4gKHRoaXMuaWFycmF5W2FycmF5X2luZGV4XSA+PiBzaGlmdF9jb3VudCkgJiAxOwoJfQoKCXZhciBiaXRtYXNrID0gMSA8PCBzaGlmdF9jb3VudDsKCglpZiAoYml0KQoJCXRoaXMuaWFycmF5W2FycmF5X2luZGV4XSB8PSBiaXRtYXNrOwoJZWxzZQoJCXRoaXMuaWFycmF5W2FycmF5X2luZGV4XSAmPSB+Yml0bWFzazsKfQoKQml0QXJyYXkucHJvdG90eXBlLm51bW9mYml0cyA9IGZ1bmN0aW9uICgpIHsKCXZhciBsZW4gPSB0aGlzLmlhcnJheS5sZW5ndGgsCgkJbnVtID0gMDsKCWZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKCQludW0gKz0gMTsKCX0KCXJldHVybiBudW07Cn0KCkJpdEFycmF5LnByb3RvdHlwZS5udW1vZmJpdHMgPSBmdW5jdGlvbiAoKSB7Cgl2YXIgbGVuID0gdGhpcy5pYXJyYXkubGVuZ3RoLAoJCW51bSA9IDA7Cglmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CgkJaWYgKHRoaXMuaWFycmF5W2ldKQoJCQludW0gKz0gdGhpcy51dC5udW1vZmJpdHModGhpcy5pYXJyYXlbaV0pOwoJfQoJcmV0dXJuIG51bTsKfQoKQml0QXJyYXkucHJvdG90eXBlLnV0ID0ge307CgpCaXRBcnJheS5wcm90b3R5cGUudXQubnVtb2ZiaXRzID0gZnVuY3Rpb24gKGJpdHMpIHsKCWJpdHMgPSAoYml0cyAmIDB4NTU1NTU1NTUpICsgKGJpdHMgPj4gMSAmIDB4NTU1NTU1NTUpOwoJYml0cyA9IChiaXRzICYgMHgzMzMzMzMzMykgKyAoYml0cyA+PiAyICYgMHgzMzMzMzMzMyk7CgliaXRzID0gKGJpdHMgJiAweDBmMGYwZjBmKSArIChiaXRzID4+IDQgJiAweDBmMGYwZjBmKTsKCWJpdHMgPSAoYml0cyAmIDB4MDBmZjAwZmYpICsgKGJpdHMgPj4gOCAmIDB4MDBmZjAwZmYpOwoJcmV0dXJuIChiaXRzICYgMHgwMDAwZmZmZikgKyAoYml0cyA+PjE2ICYgMHgwMDAwZmZmZik7Cn0KCi8vLS0tLQoKcHJvY2Vzcy5zdGRvdXQud3JpdGUoIkhlbGxvLCBXb3JsZCFcbiIpOwoKdmFyIG9iaiA9IG5ldyBCaXRBcnJheSgpOwoKb2JqLmJpdCggIDAsIDEpOwpvYmouYml0KDEwMCwgMCk7Cm9iai5iaXQoMjAwLCAxKTsKb2JqLmJpdCgzMDAsIDApOwpvYmouYml0KDQwMCwgMSk7CgovLyAgb2JqKDQsIDEpOyAgLyog44GT44Gu44KI44GG44Gr44CBb2Jq44KS6Zai5pWw44Go44GX44Gm5L2/44GI44KL44Go44Kk44Kk44KI44GtICovCgp2YXIgbnVtID0gb2JqLm51bW9mYml0cygpOwoKcHJvY2Vzcy5zdGRvdXQud3JpdGUoIm51bSA9ICIgKyBudW0udG9TdHJpbmcoKSk7Cgo=