From C
#include<stdio.h>
unsigned getbits(unsigned x, int p, int n) {
/* Build a mask consisting of 'n' bits */
/* ...111 */
int all_ones = ~0;
/* ...111000 */
int all_ones_shifted_left = all_ones << n;
/* ...000111 */
int mask = ~all_ones_shifted_left;
/* Shift 'x' down to discard lower bits we don't care about */
/* How many bits do we discard? */
int shift_down = p + 1 - n;
/* ...76543210 -> ...765432 */
unsigned int x_shifted_down = x >> shift_down;
/* Use the mask to discard the upper bits we don't care about */
return x_shifted_down & mask;
}
int main(void) {
/* Decimal 8 is binary 1000 */
unsigned x = 8;
/* Position 4 starts at ...[43210 */
int p = 4;
/* 3 bits means the range is ...[432]10 */
int n = 3;
printf("%d", getbits(x, p, n));
return 0;
}