1 #include "otsdaq-core/BitManipulator/BitManipulator.h"
2 #include "otsdaq-core/MessageFacility/MessageFacility.h"
3 #include "otsdaq-core/Macros/CoutHeaderMacros.h"
12 BitManipulator::BitManipulator()
17 BitManipulator::~BitManipulator()
21 uint64_t BitManipulator::insertBits(uint64_t& data, uint64_t value,
unsigned int startBit,
unsigned int numberOfBits)
24 for(
unsigned int i=0; i<numberOfBits; i++)
25 data &= ~((uint64_t)1 << (startBit+i));
27 data |= (value << startBit);
33 uint64_t BitManipulator::insertBits(std::string& data, uint64_t value,
unsigned int startBit,
unsigned int numberOfBits)
36 const unsigned int bitsInAByte = 8;
38 uint8_t overWritten = 0;
39 int startByte = startBit/bitsInAByte;
40 int finalByte = (startBit + numberOfBits-1)/bitsInAByte;
41 int startBitInByte = startBit%bitsInAByte;
42 int finalBitInByte = (startBit + numberOfBits-1)%bitsInAByte;
44 int firstByteLength = bitsInAByte;
45 int lastByteLength = (startBit + numberOfBits)%bitsInAByte;
50 for(
int j = 0; j <= finalByte - startByte; ++j)
54 if (j != finalByte - startByte)
57 finalBitInByte = (startBit + numberOfBits-1)%8;
60 finalBitInByte = 7 - startBitInByte;
61 startBitInByte = 7 - tmp;
65 overWritten = data.substr(startByte+j,1).data()[0];
69 for (
int y = 0; y <= finalBitInByte - startBitInByte; ++y)
71 if (finalByte - startByte > 1)
73 if (j != finalByte - startByte)
74 toWrite |= ((value >> (lastByteLength + (finalByte - startByte -1 -j)*8 + y))&1) << y;
76 toWrite |= ((value >> (lastByteLength + y))&1) << y;
78 else if (finalByte - startByte == 1)
79 toWrite |= ((value >> (lastByteLength*(1-j) + y))&1) << y;
80 else if (finalByte - startByte == 0)
81 toWrite |= ((value >> y)&1) << y;
87 for(
int n=0; n<finalBitInByte - startBitInByte + 1; n++)
89 overWritten &= ~((uint64_t)1 << (startBitInByte+n));
93 overWritten |= (toWrite << startBitInByte);
96 data[startByte+j] = overWritten;
99 firstByteLength = finalBitInByte - startBitInByte + 1;
102 return (uint64_t)overWritten;
106 uint64_t BitManipulator::reverseBits(uint64_t data,
unsigned int startBit,
unsigned int numberOfBits)
108 uint64_t reversedData = 0;
109 for(
unsigned int r=startBit; r<numberOfBits; r++)
110 reversedData |= ((data>>r)&1)<<(numberOfBits-1-r);
115 uint32_t BitManipulator::insertBits(uint32_t& data, uint32_t value,
unsigned int startBit,
unsigned int numberOfBits)
118 value = value << startBit;
119 for(
unsigned int i=0; i<32; i++)
121 if( i>=startBit && i<startBit+numberOfBits)
122 data &= ~((uint32_t)1 << i);
124 value &= ~((uint32_t)1 << i);
132 uint32_t BitManipulator::insertBits(std::string& data, uint32_t value,
unsigned int startBit,
unsigned int numberOfBits)
135 const unsigned int bitsInAByte = 8;
137 uint8_t overWritten = 0;
138 int startByte = startBit/bitsInAByte;
139 int finalByte = (startBit + numberOfBits-1)/bitsInAByte;
140 int startBitInByte = startBit%8;
141 int finalBitInByte = (startBit + numberOfBits-1)%bitsInAByte;
143 int firstByteLength = bitsInAByte;
144 int lastByteLength = (startBit + numberOfBits)%bitsInAByte;
149 for(
int j = 0; j <= finalByte - startByte; ++j)
153 if (j != finalByte - startByte)
156 finalBitInByte = (startBit + numberOfBits-1)%8;
158 tmp = finalBitInByte;
159 finalBitInByte = 7 - startBitInByte;
160 startBitInByte = 7 - tmp;
164 overWritten = data.substr(startByte+j,1).data()[0];
167 toWrite = (uint8_t)0;
168 for (
int y = 0; y <= finalBitInByte - startBitInByte; ++y)
170 if (finalByte - startByte > 1)
172 if (j != finalByte - startByte)
173 toWrite |= ((value >> (lastByteLength + (finalByte - startByte -1 -j)*8 + y))&1) << y;
175 toWrite |= ((value >> (lastByteLength + y))&1) << y;
177 else if (finalByte - startByte == 1)
178 toWrite |= ((value >> (lastByteLength*(1-j) + y))&1) << y;
179 else if (finalByte - startByte == 0)
180 toWrite |= ((value >> y)&1) << y;
186 for(
int n=0; n<finalBitInByte - startBitInByte + 1; n++)
188 overWritten &= ~((uint32_t)1 << (startBitInByte+n));
192 overWritten |= (toWrite << startBitInByte);
195 data[startByte+j] = overWritten;
198 firstByteLength = finalBitInByte - startBitInByte + 1;
201 return (uint32_t)overWritten;
205 uint32_t BitManipulator::reverseBits(uint32_t data,
unsigned int startBit,
unsigned int numberOfBits)
207 uint32_t reversedData = 0;
208 for(
unsigned int r=startBit; r<startBit+numberOfBits; r++)
209 reversedData |= ((data>>r)&1)<<(numberOfBits-1-r);
214 uint32_t BitManipulator::readBits(uint32_t data,
unsigned int startBit,
unsigned int numberOfBits)
216 uint32_t returnData = 0;
217 for(
unsigned int r=startBit; r<startBit+numberOfBits; r++)
218 returnData += ((data>>r)&0x1)<<(r-startBit);