ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

///////////////////////////////////////////////////////////////////////////////
///
/// This is a service class for packing and unpacking bits in a 32 bit word.
///
///////////////////////////////////////////////////////////////////////////////

#include <TError.h>

#include "AliBitPacking.h"


ClassImp(AliBitPacking)


//_____________________________________________________________________________
Bool_t AliBitPacking::PackWord(UInt_t data, UInt_t &word, 
			       Int_t startBit, Int_t stopBit)
{
// Packs data into the word buffer from startBit bit up to stopBit bit

  // check that startBit and stopBit are reasonable
  if (startBit > stopBit) {
    ::Error("AliBitPacking::PackWord", 
	    "startBit is larger than stopBit");
    return kFALSE;
  }
  if (stopBit > 31) {
    ::Error("AliBitPacking::PackWord", 
	    "stopBit exceeds valid range of 32 bits");
    return kFALSE;
  }

  // create a word with the bits 0 to (stopBit-startBit) set
  UInt_t bits = 0xFFFFFFFF;
  if (stopBit-startBit < 31) bits = (1 << (stopBit-startBit+1)) - 1;

  // check that the data fits into the given bit range
  if (data > bits){
    ::Error("AliBitPacking::PackWord", 
	    "Word to be filled is not within desired length");
    return kFALSE;
  }

  // clear the bits from startBit to stopBit
  word &= (0xFFFFFFFF ^ (bits << startBit));

  // fill in the data bits
  word |= (data << startBit);

  return kTRUE;
}

//_____________________________________________________________________________
UInt_t AliBitPacking::UnpackWord(UInt_t word, Int_t startBit, Int_t stopBit)
{
// Unpacks data of stopBit-startBit+1 bits from word buffer starting from 
// the position indicated by startBit

  // check that startBit and stopBit are reasonable
  if (startBit > stopBit) {
    ::Error("AliBitPacking::UnpackWord", 
	    "startBit is larger than stopBit");
    return 0xFFFFFFFF;
  }
  if (stopBit > 31) {
    ::Error("AliBitPacking::UnpackWord", 
	    "stopBit exceeds valid range of 32 bits");
    return 0xFFFFFFFF;
  }

  // create a word with the bits 0 to (stopBit-startBit) set
  UInt_t bits = 0xFFFFFFFF;
  if (stopBit-startBit < 31) bits = (1 << (stopBit-startBit+1)) - 1;

  // pick out the requested bits
  return ((word >> startBit) & bits);
}
 AliBitPacking.cxx:1
 AliBitPacking.cxx:2
 AliBitPacking.cxx:3
 AliBitPacking.cxx:4
 AliBitPacking.cxx:5
 AliBitPacking.cxx:6
 AliBitPacking.cxx:7
 AliBitPacking.cxx:8
 AliBitPacking.cxx:9
 AliBitPacking.cxx:10
 AliBitPacking.cxx:11
 AliBitPacking.cxx:12
 AliBitPacking.cxx:13
 AliBitPacking.cxx:14
 AliBitPacking.cxx:15
 AliBitPacking.cxx:16
 AliBitPacking.cxx:17
 AliBitPacking.cxx:18
 AliBitPacking.cxx:19
 AliBitPacking.cxx:20
 AliBitPacking.cxx:21
 AliBitPacking.cxx:22
 AliBitPacking.cxx:23
 AliBitPacking.cxx:24
 AliBitPacking.cxx:25
 AliBitPacking.cxx:26
 AliBitPacking.cxx:27
 AliBitPacking.cxx:28
 AliBitPacking.cxx:29
 AliBitPacking.cxx:30
 AliBitPacking.cxx:31
 AliBitPacking.cxx:32
 AliBitPacking.cxx:33
 AliBitPacking.cxx:34
 AliBitPacking.cxx:35
 AliBitPacking.cxx:36
 AliBitPacking.cxx:37
 AliBitPacking.cxx:38
 AliBitPacking.cxx:39
 AliBitPacking.cxx:40
 AliBitPacking.cxx:41
 AliBitPacking.cxx:42
 AliBitPacking.cxx:43
 AliBitPacking.cxx:44
 AliBitPacking.cxx:45
 AliBitPacking.cxx:46
 AliBitPacking.cxx:47
 AliBitPacking.cxx:48
 AliBitPacking.cxx:49
 AliBitPacking.cxx:50
 AliBitPacking.cxx:51
 AliBitPacking.cxx:52
 AliBitPacking.cxx:53
 AliBitPacking.cxx:54
 AliBitPacking.cxx:55
 AliBitPacking.cxx:56
 AliBitPacking.cxx:57
 AliBitPacking.cxx:58
 AliBitPacking.cxx:59
 AliBitPacking.cxx:60
 AliBitPacking.cxx:61
 AliBitPacking.cxx:62
 AliBitPacking.cxx:63
 AliBitPacking.cxx:64
 AliBitPacking.cxx:65
 AliBitPacking.cxx:66
 AliBitPacking.cxx:67
 AliBitPacking.cxx:68
 AliBitPacking.cxx:69
 AliBitPacking.cxx:70
 AliBitPacking.cxx:71
 AliBitPacking.cxx:72
 AliBitPacking.cxx:73
 AliBitPacking.cxx:74
 AliBitPacking.cxx:75
 AliBitPacking.cxx:76
 AliBitPacking.cxx:77
 AliBitPacking.cxx:78
 AliBitPacking.cxx:79
 AliBitPacking.cxx:80
 AliBitPacking.cxx:81
 AliBitPacking.cxx:82
 AliBitPacking.cxx:83
 AliBitPacking.cxx:84
 AliBitPacking.cxx:85
 AliBitPacking.cxx:86
 AliBitPacking.cxx:87
 AliBitPacking.cxx:88
 AliBitPacking.cxx:89
 AliBitPacking.cxx:90
 AliBitPacking.cxx:91
 AliBitPacking.cxx:92
 AliBitPacking.cxx:93
 AliBitPacking.cxx:94