public override int Select1(int rank)
{
if (rank <= 0) {
return -1;
}
int absindex = -1;
if (this.Abs.Length > 0) {
absindex = Search.FindFirst<uint> ((uint)rank, this.Abs);
}
if (absindex >= 0 && this.Abs[absindex] == rank) {
absindex--;
}
if (absindex < 0) {
return BitAccess.Select1 (this.BitBlocks, 0, this.B, rank);
} else {
// Console.WriteLine ("GNBitmap Abs.Count: {0}, absindex: {1}", this.Abs.Count, absindex);
int startindex = (absindex + 1) * this.B;
//return ((startindex)<<5) +
// BitAccess.Select1 (this.BitBlocks, startindex, this.AbsBlockSize, rank - (int)this.Abs[absindex]);
int rel = 0;
if (this.BitBlocks.Length != startindex) {
rel = BitAccess.Select1 (this.BitBlocks, startindex, this.B, rank - (int)this.Abs[absindex]);
}
return (startindex << 5) + rel;
}
}