docs: function bitcount(key, start, end /* req */) {
    var req = typeof arguments[arguments.length - 1] === 'object'
      ? arguments[arguments.length - 1] : null
      , buf = this.getValueBuffer(key, req, true)
      , c = 0
      , count = 0
      , bytecount = 16;
  
    // no key or empty string
    if(buf === undefined || buf.length === 0) return 0;
    // got start/end range
    if(arguments.length >= 3) {
      if(start < 0) start = buf.length + start;
      if(end < 0) end = buf.length + end;
      if(start < 0) start = 0;
      if(end < 0) end = 0;
      if(end > buf.length) end = buf.length;
    }else{
      start = 0;
      end = buf.length;
    }
  
    if(start > end) return 0;
  
    // get the range we are inspecting
    buf = buf.slice(start, end + 1);
  
    function addBitCount(buf) {
      for(var i = 0;i < buf.length;i++) {
        if(buf[i] & 0x80) count++;
        if(buf[i] & 0x40) count++;
        if(buf[i] & 0x20) count++;
        if(buf[i] & 0x10) count++;
        if(buf[i] & 0x08) count++;
        if(buf[i] & 0x04) count++;
        if(buf[i] & 0x02) count++;
        if(buf[i] & 0x01) count++;
      }
    }
  
    // leading non-aligned bytes
    var mod = buf.length % bytecount;
    while(c < mod) {
      addBitCount(buf.slice(c, c + 1));
      c++;
    }
  
    // aligned bytes
    while(c < buf.length) {
      addBitCount(buf.slice(c, c + bytecount));
      c += bytecount;
    }
    return count;
  }