Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Function to extract a series of bits from a value.
- // Params: 'num_bits' bits from 'init_pos' position (e.g., pos 8, 8 bits, pos 16, 8m bits, pos 24 8 bits.
- // Returns the extracted value as int.
- // Signed values may have undefined behaviour based on endian-ness, so we use abs(). -Z
- int extract_bits(int base_val, int num_bits, int init_pos)
- {
- unsigned int tempVal = abs(base_val); //Disregard sign.
- return ( ( (1 << num_bits) - 1 ) & ( tempVal >> (init_pos - 1) ) );
- }
- //int foo 11110010001100111100010000110100; //11110010 00110011 11000100 00110100
- //int lowestEight = bitExtract(foo,8,8); //00110100
- //int secondEight = bitExtract(foo,8,16); //11000100
- // I don't know if any of these have specific merit beyond the above. -Z
- unsigned short extract(unsigned short value, int begin, int end)
- {
- unsigned short mask = (1 << (end - begin)) - 1;
- return (value >> begin) & mask;
- }
- int extractBit(int byte, int pos)
- {
- if( !((pos >= 0) && (pos < 16)) )
- {
- return 0;
- }
- return ( ( byte & (1<<pos) ) >> pos);
- }
- uint32_t getBits( uint32_t allbits, int lsb, int count )
- {
- uint32_t mask = ~(0xffffffff << count) << lsb ;
- return (allbits & mask) >> lsb ;
- }
- uint32_t getBits( uint32_t allbits, int lsb, int msb )
- {
- uint32_t mask = ~(0xffffffff << (msb + 1 - lsb)) << lsb ;
- return (allbits & mask) >> lsb ;
- }
- int extractBitRange(int byte, int startingPos, int offset)
- {
- if( !(((startingPos + offset) >= 0) && ( (startingPos + offset) < 16)) )
- {
- return 0;
- }
- return ( byte >> startingPos ) & ~(0xff << (offset + 1));
- }
- unsigned extract(unsigned num, unsigned hi, unsigned lo) {
- uint32_t range = (hi - lo + 1); //number of bits to be extracted
- //shifting a number by the number of bits it has produces inconsistent
- //results across machines so we need a special case for extract(num, 31, 0)
- if(range == 32)
- return num;
- uint32_t result = 0;
- //following the rule above, ((1 << x) - 1) << y) makes the mask:
- uint32_t mask = ((1 << range) -1) << lo;
- //AND num and mask to get only the bits in our range
- result = num & mask;
- result = result >> lo; //gets rid of trailing 0s
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement