33 TBits::TBits(UInt_t nbits) : fNbits(nbits)
35 if (nbits <= 0) nbits = 8;
36 fNbytes = ((nbits-1)/8) + 1;
37 fAllBits =
new UChar_t[fNbytes];
39 memset(fAllBits,0,fNbytes);
45 TBits::TBits(
const TBits &original) : TObject(original), fNbits(original.fNbits),
46 fNbytes(original.fNbytes)
48 fAllBits =
new UChar_t[fNbytes];
49 memcpy(fAllBits,original.fAllBits,fNbytes);
56 TBits& TBits::operator=(
const TBits& rhs)
59 TObject::operator=(rhs);
61 fNbytes = rhs.fNbytes;
64 fAllBits =
new UChar_t[fNbytes];
65 memcpy(fAllBits,rhs.fAllBits,fNbytes);
84 void TBits::Clear(Option_t * )
97 if (!fNbits || !fAllBits)
return;
100 needed > 0 && fAllBits[needed]==0; ) { needed--; };
103 if (needed!=fNbytes) {
104 UChar_t *old_location = fAllBits;
105 fAllBits =
new UChar_t[needed];
107 memcpy(fAllBits,old_location,needed);
108 delete [] old_location;
118 UInt_t TBits::CountBits(UInt_t startBit)
const
120 static const Int_t nbits[256] = {
121 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,
122 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
123 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
124 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
125 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
126 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
127 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
128 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
129 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
130 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
131 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
132 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
133 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
134 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
135 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
136 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8};
140 for(i=0; i<fNbytes; i++) {
141 count += nbits[fAllBits[i]];
145 if (startBit >= fNbits)
return count;
146 UInt_t startByte = startBit/8;
147 UInt_t ibit = startBit%8;
149 for (i=ibit;i<8;i++) {
150 if (fAllBits[startByte] & (1<<ibit)) count++;
154 for(i=startByte; i<fNbytes; i++) {
155 count += nbits[fAllBits[i]];
165 void TBits::DoAndEqual(
const TBits& rhs)
167 UInt_t min = (fNbytes<rhs.fNbytes) ? fNbytes : rhs.fNbytes;
168 for(UInt_t i=0; i<min; ++i) {
169 fAllBits[i] &= rhs.fAllBits[i];
172 memset(&(fAllBits[min]),0,fNbytes-min);
181 void TBits::DoOrEqual(
const TBits& rhs)
183 UInt_t min = (fNbytes<rhs.fNbytes) ? fNbytes : rhs.fNbytes;
184 for(UInt_t i=0; i<min; ++i) {
185 fAllBits[i] |= rhs.fAllBits[i];
194 void TBits::DoXorEqual(
const TBits& rhs)
196 UInt_t min = (fNbytes<rhs.fNbytes) ? fNbytes : rhs.fNbytes;
197 for(UInt_t i=0; i<min; ++i) {
198 fAllBits[i] ^= rhs.fAllBits[i];
207 for(UInt_t i=0; i<fNbytes; ++i) {
208 fAllBits[i] = ~fAllBits[i];
217 void TBits::DoLeftShift(UInt_t shift)
219 if (shift==0)
return;
220 const UInt_t wordshift = shift / 8;
221 const UInt_t offset = shift % 8;
222 Resize(fNbits + shift);
224 for(UInt_t n = fNbytes - 1; n >= wordshift; --n) {
225 fAllBits[n] = fAllBits[ n - wordshift ];
228 const UInt_t sub_offset = 8 - offset;
229 for(UInt_t n = fNbytes - 1; n > wordshift; --n) {
230 fAllBits[n] = (fAllBits[n - wordshift] << offset) |
231 (fAllBits[n - wordshift - 1] >> sub_offset);
233 fAllBits[wordshift] = fAllBits[0] << offset;
235 memset(fAllBits,0,wordshift);
242 void TBits::DoRightShift(UInt_t shift)
244 if (shift==0)
return;
245 const UInt_t wordshift = shift / 8;
246 const UInt_t offset = shift % 8;
247 if (fNbytes < (wordshift + 1)) {
248 memset(fAllBits, 0, fNbytes);
251 const UInt_t limit = fNbytes - wordshift - 1;
254 for (UInt_t n = 0; n <= limit; ++n)
255 fAllBits[n] = fAllBits[n + wordshift];
257 const UInt_t sub_offset = 8 - offset;
258 for (UInt_t n = 0; n < limit; ++n)
259 fAllBits[n] = (fAllBits[n + wordshift] >> offset) |
260 (fAllBits[n + wordshift + 1] << sub_offset);
261 fAllBits[limit] = fAllBits[fNbytes - 1] >> offset;
264 memset(&(fAllBits[limit + 1]), 0, fNbytes - limit - 1);
275 UInt_t TBits::FirstNullBit(UInt_t startBit)
const
277 static const Int_t fbits[256] = {
278 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
279 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,
280 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
281 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,
282 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
283 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,
284 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
285 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,
286 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
287 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,
288 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
289 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,
290 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
291 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,
292 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
293 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,8};
297 for(i=0; i<fNbytes; i++) {
298 if (fAllBits[i] != 255)
return 8*i + fbits[fAllBits[i]];
302 if (startBit >= fNbits)
return fNbits;
303 UInt_t startByte = startBit/8;
304 UInt_t ibit = startBit%8;
306 for (i=ibit;i<8;i++) {
307 if ((fAllBits[startByte] & (1<<i)) == 0)
return 8*startByte+i;
311 for(i=startByte; i<fNbytes; i++) {
312 if (fAllBits[i] != 255)
return 8*i + fbits[fAllBits[i]];
320 UInt_t TBits::LastNullBit(UInt_t startBit)
const
322 static const Int_t fbits[256] = {
323 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
324 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
325 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
326 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
327 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
328 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
329 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
330 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
331 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
332 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
333 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
334 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
335 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
336 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
337 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
338 3,3,3,3,3,3,3,3,2,2,2,2,1,1,0,8};
341 if (startBit>=fNbits) startBit = fNbits-1;
342 UInt_t startByte = startBit/8;
343 UInt_t ibit = startBit%8;
345 for (i=ibit+1;i>0;i--) {
346 if ((fAllBits[startByte] & (1<<(i-1))) == 0)
return 8*startByte+i-1;
350 for(i=startByte+1; i>0; i--) {
351 if (fAllBits[i-1] != 255)
return 8*(i-1) + fbits[fAllBits[i-1]];
359 UInt_t TBits::FirstSetBit(UInt_t startBit)
const
361 static const Int_t fbits[256] = {
362 8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
363 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
364 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
365 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
366 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
367 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
368 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
369 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
370 7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
371 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
372 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
373 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
374 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
375 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
376 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
377 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0};
381 for(i=0; i<fNbytes; i++) {
382 if (fAllBits[i] != 0)
return 8*i + fbits[fAllBits[i]];
386 if (startBit >= fNbits)
return fNbits;
387 UInt_t startByte = startBit/8;
388 UInt_t ibit = startBit%8;
390 for (i=ibit;i<8;i++) {
391 if ((fAllBits[startByte] & (1<<i)) != 0)
return 8*startByte+i;
395 for(i=startByte; i<fNbytes; i++) {
396 if (fAllBits[i] != 0)
return 8*i + fbits[fAllBits[i]];
404 UInt_t TBits::LastSetBit(UInt_t startBit)
const
406 static const Int_t fbits[256] = {
407 8,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
408 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
409 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
410 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
411 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
412 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
413 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
414 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
415 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
416 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
417 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
418 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
419 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
420 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
421 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
422 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7};
425 if (startBit>=fNbits) startBit = fNbits-1;
426 UInt_t startByte = startBit/8;
427 UInt_t ibit = startBit%8;
429 for (i=ibit+1;i>0;i--) {
430 if ((fAllBits[startByte] & (1<<(i-1))) != 0)
return 8*startByte+i-1;
434 for(i=startByte+1; i>0; i--) {
435 if (fAllBits[i-1] != 0)
return 8*(i-1) + fbits[fAllBits[i-1]];
443 void TBits::Output(std::ostream &os)
const
445 for(UInt_t i=0; i<fNbytes; ++i) {
446 UChar_t val = fAllBits[fNbytes - 1 - i];
447 for (UInt_t j=0; j<8; ++j) {
448 os << (Bool_t)(val&0x80);
458 void TBits::Paint(Option_t *)
465 void TBits::Print(Option_t *)
const
468 for(UInt_t i=0; i<fNbytes; ++i) {
469 UChar_t val = fAllBits[i];
470 for (UInt_t j=0; j<8; ++j) {
471 if (val & 1) printf(
" bit:%4d = 1\n",count);
481 void TBits::ResetAllBits(Bool_t)
483 if (fAllBits) memset(fAllBits,0,fNbytes);
489 void TBits::ReserveBytes(UInt_t nbytes)
491 if (nbytes > fNbytes) {
493 UChar_t *newBits=
new UChar_t[nbytes];
503 void TBits::Set(UInt_t nbits,
const Char_t *array)
505 UInt_t nbytes=(nbits+7)>>3;
507 ReserveBytes(nbytes);
510 memcpy(fAllBits, array, nbytes);
516 void TBits::Get(Char_t *array)
const
518 memcpy(array, fAllBits, (fNbits+7)>>3);
529 void TBits::Set(UInt_t nbits,
const Short_t *array)
533 Set(nbits, (
const Char_t*)array);
536 void TBits::Set(UInt_t nbits,
const Int_t *array)
540 Set(nbits, (
const Char_t*)array);
543 void TBits::Set(UInt_t nbits,
const Long64_t *array)
547 Set(nbits, (
const Char_t*)array);
550 void TBits::Get(Short_t *array)
const
557 void TBits::Get(Int_t *array)
const
564 void TBits::Get(Long64_t *array)
const
577 void TBits::Set(UInt_t nbits,
const Short_t *array)
580 UInt_t nbytes = ((nbits+15)>>3)&~1;
582 ReserveBytes(nbytes);
586 const UChar_t *cArray = (
const UChar_t*)array;
587 for (UInt_t i=0; i<nbytes; i+=2) {
588 fAllBits[i] = cArray[i+1];
589 fAllBits[i+1] = cArray[i];
593 void TBits::Set(UInt_t nbits,
const Int_t *array)
596 UInt_t nbytes = ((nbits+31)>>3)&~3;
598 ReserveBytes(nbytes);
602 const UChar_t *cArray = (
const UChar_t*)array;
603 for (UInt_t i=0; i<nbytes; i+=4) {
604 fAllBits[i] = cArray[i+3];
605 fAllBits[i+1] = cArray[i+2];
606 fAllBits[i+2] = cArray[i+1];
607 fAllBits[i+3] = cArray[i];
611 void TBits::Set(UInt_t nbits,
const Long64_t *array)
614 UInt_t nbytes = ((nbits+63)>>3)&~7;
616 ReserveBytes(nbytes);
620 const UChar_t *cArray = (
const UChar_t*)array;
621 for (UInt_t i=0; i<nbytes; i+=8) {
622 fAllBits[i] = cArray[i+7];
623 fAllBits[i+1] = cArray[i+6];
624 fAllBits[i+2] = cArray[i+5];
625 fAllBits[i+3] = cArray[i+4];
626 fAllBits[i+4] = cArray[i+3];
627 fAllBits[i+5] = cArray[i+2];
628 fAllBits[i+6] = cArray[i+1];
629 fAllBits[i+7] = cArray[i];
633 void TBits::Get(Short_t *array)
const
637 UInt_t nBytes = (fNbits+7)>>3;
638 UInt_t nSafeBytes = nBytes&~1;
640 UChar_t *cArray=(UChar_t*)array;
641 for (UInt_t i=0; i<nSafeBytes; i+=2) {
642 cArray[i] = fAllBits[i+1];
643 cArray[i+1] = fAllBits[i];
646 if (nBytes>nSafeBytes) {
647 cArray[nSafeBytes+1] = fAllBits[nSafeBytes];
651 void TBits::Get(Int_t *array)
const
655 UInt_t nBytes = (fNbits+7)>>3;
656 UInt_t nSafeBytes = nBytes&~3;
658 UChar_t *cArray=(UChar_t*)array;
660 for (i=0; i<nSafeBytes; i+=4) {
661 cArray[i] = fAllBits[i+3];
662 cArray[i+1] = fAllBits[i+2];
663 cArray[i+2] = fAllBits[i+1];
664 cArray[i+3] = fAllBits[i];
667 for (i=0; i<nBytes-nSafeBytes; ++i) {
668 cArray[nSafeBytes + (3 - i)] = fAllBits[nSafeBytes + i];
672 void TBits::Get(Long64_t *array)
const
676 UInt_t nBytes = (fNbits+7)>>3;
677 UInt_t nSafeBytes = nBytes&~7;
679 UChar_t *cArray=(UChar_t*)array;
681 for (i=0; i<nSafeBytes; i+=8) {
682 cArray[i] = fAllBits[i+7];
683 cArray[i+1] = fAllBits[i+6];
684 cArray[i+2] = fAllBits[i+5];
685 cArray[i+3] = fAllBits[i+4];
686 cArray[i+4] = fAllBits[i+3];
687 cArray[i+5] = fAllBits[i+2];
688 cArray[i+6] = fAllBits[i+1];
689 cArray[i+7] = fAllBits[i];
692 for (i=0; i<nBytes-nSafeBytes; ++i) {
693 cArray[nSafeBytes + (7 - i)] = fAllBits[nSafeBytes + i];
699 Bool_t TBits::operator==(
const TBits &other)
const
703 if (fNbits == other.fNbits) {
704 return !memcmp(fAllBits, other.fAllBits, (fNbits+7)>>3);
705 }
else if (fNbits < other.fNbits) {
706 return !memcmp(fAllBits, other.fAllBits, (fNbits+7)>>3) && other.FirstSetBit(fNbits) == other.fNbits;
708 return !memcmp(fAllBits, other.fAllBits, (other.fNbits+7)>>3) && FirstSetBit(other.fNbits) == fNbits;